精华内容
下载资源
问答
  • Java执行任务有多次试和超时
    千次阅读
    2021-03-05 12:20:48

    我认为,但我认为,如果您正在安排与网络相关的任务,则不应重试,而应最终并行运行.我稍后会描述其他方法.

    关于您的代码,您应该将任务传递给执行程序,或将FutureTask传递给线程.它不会产生一个线程或自己执行.如果你有一个执行者(参见ExecutorService),你甚至不需要FutureTask,你可以简单地安排它并获得一个可调用的.

    因此,假设您有ExecutorService,您可以调用:

    Future future = yourExecutor.submit(task);

    Future.get(timeout)将等待该超时并最终返回TimeoutException,即使该任务从未启动过,例如,如果Executor已经忙于完成其他工作而无法找到一个空闲线程.所以,你最终可能会尝试5次并等待几秒钟,而不会让任务有机会运行.这可能是也可能不是你所期望的,但通常不是.也许你应该等到它开始才能超时.

    此外,您应该显式取消Future,即使它抛出TimeoutException,否则它可能会继续运行,因为文档和代码都没有说当get with timeout失败时它会停止.

    即使你取消它,除非Callable被“正确写入”,它可能会继续运行一段时间.在这部分代码中你无法做到这一点,只要记住,没有任何线程可以“真正地停止”另一个线程在Java中所做的事情,并且有充分的理由.

    但是,我认为您的任务主要与网络相关,因此它应该对线程中断做出正确的反应.

    我通常使用不同的策略是这样的情况:

    >我会写公共静态T执行(可调用任务,int maxTries,int超时),所以任务,最大尝试次数(可能是1),最大总超时(“我希望答案最多10秒,无论多少你尝试的次数,10秒或什么都不是“)

    >我开始产生任务,将它交给执行者,然后调用future.get(timeout / tries)

    >如果我收到结果,请将其退回.如果我收到异常,会再试一次(见后)

    >但是如果我得到超时,我不会取消将来,而是将其保存在列表中.

    >我检查是否已经过了太多时间,或者重试次数太多.在这种情况下,我取消列表中的所有期货并抛出异常,返回null,无论如何

    >否则,我循环,再次安排任务(与第一个任务并行).

    >见第2点

    >如果我没有收到结果,我会检查列表中的未来,也许是之前生成的任务之一.

    假设您的任务可以执行多次(因为我认为它们是,否则无法重试),对于网络内容我发现此解决方案可以更好地工作.

    假设您的网络实际上非常繁忙,您要求网络连接,每次重试20秒.由于您的网络正忙,20次重试中没有一次能够在2秒内完成连接.但是,持续40秒的单次执行可能会设法连接和接收数据.这就像一个人在网络缓慢的情况下强制性地在页面上按f5,它不会有任何好处,因为每次浏览器都必须从头开始.

    相反,我保持各种期货运行,第一个设法获取数据将返回结果,其他将停止.如果第一个挂起,第二个可以工作,或者第三个可能.

    与浏览器相比,就像打开另一个选项卡并重试在那里加载页面而不关闭第一个选项卡.如果网络很慢,第二个将花费一些时间,但不会停止第一个,最终将正确加载.如果相反第一个标签挂起,第二个标签将快速加载.无论哪个先加载,我们都可以关闭另一个标签.

    更多相关内容
  • Celery 4.3.0 任务失败试机制

    千次阅读 2019-10-21 20:23:09
    在异步调用任务中经常需要调用第三方的api请求,如果一次执行失败,则应该进行试执行。否则,如果在执行一些连续性的chain链条任务,前面执行失败,那么后续的也就不用执行了。 下面来看看一个发送邮件失败,然后...

    存在的现象

    在异步调用任务中经常需要调用第三方的api请求,如果一次执行失败,则应该进行重试执行。否则,如果在执行一些连续性的chain链条任务,前面执行失败,那么后续的也就不用执行了。

    下面来看看一个发送邮件失败,然后重试执行的示例。

    Celery任务的文档结构

    该示例是延续上一篇Django 2.1.7 Celery 4.3.0 异步发送邮件示例的,如果不清楚如何发送邮件,可以先查阅一下我上一篇的内容。

    错误重试示例

    故意将邮件服务的地址配置错误

    为了做到错误的演示,我首先将发送邮件的smtp地址写错,如下:

    那么稍后执行发送邮件的时候,就一定会报找不到smtp的错误。

    编写错误重试的task任务

    # 定义任务函数
    @celery_app.task(bind=True)
    def send_register_active_email(self,to_email, username, token):
        '''发送激活邮件'''
        # 组织邮件信息
        subject = '欢迎信息'
        message = ''
        sender = settings.EMAIL_FROM
        receiver = [to_email]
        html_message = '<h1>%s, 欢迎您成为xxx注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)
    
        print("=========== 执行发送邮件 ===============")
    
        try:
            send_mail(subject, message, sender, receiver, html_message=html_message)
        except Exception as e:
            """
                    邮件发送失败,使用retry进行重试
    
                    retry的参数可以有:
                        exc:指定抛出的异常
                        throw:重试时是否通知worker是重试任务
                        eta:指定重试的时间/日期
                        countdown:在多久之后重试(每多少秒重试一次)
                        max_retries:最大重试次数
                    """
            raise self.retry(exc=e, countdown=3, max_retries=5)
    

    该示例任务将会进行调用发送邮件,当发生错误后,间隔3秒则重试执行一次,总共5次。
    可以通过print的打印信息来确认重试的次数。

    启动celery任务

    windows启动命令:

    celery -A celery_tasks worker -l info -P eventlet
    

    linux启动命令:

    celery -A celery_tasks worker -l info
    

    执行celery任务

    启动完毕celery之后,那么下面进行交互模式进行测试,执行如下:

    In [1]: from celery_tasks.tasks import send_register_active_email
    
    In [2]: to_email = 'lijw@******.cn'
    
    In [3]: token = '123456'
    
    In [4]: username = 'lijw'
    
    In [5]: send_register_active_email.delay(to_email,username,token)
    Out[5]: <AsyncResult: 02deebc0-5d64-43f9-9ad5-5ccfe260ec70>
    

    执行完毕任务后,查看celery的执行日志,如下:

    [2019-10-21 14:01:09,508: INFO/MainProcess] celery@junwei1 ready.
    [2019-10-21 14:01:09,509: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/8.
    [2019-10-21 14:01:14,353: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a]
    
    # 任务第一次执行,然后执行失败
    [2019-10-21 14:01:14,354: WARNING/MainProcess] =========== 执行发送邮件 ===============
    [2019-10-21 14:01:15,311: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a]  ETA:[2019-10-21 06:01:18.21
    8857+00:00]
    [2019-10-21 14:01:15,345: INFO/MainProcess] Task celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a] retry: Retry in 3s: gaierror(11001, 'N
    o address found')
    
    # 当执行错误之后,下面则会重试执行5次任务,直到成功,或者失败
    [2019-10-21 14:01:18,224: WARNING/MainProcess] =========== 执行发送邮件 ===============
    [2019-10-21 14:01:18,253: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a]  ETA:[2019-10-21 06:01:21.22
    5853+00:00]
    [2019-10-21 14:01:18,265: INFO/MainProcess] Task celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a] retry: Retry in 3s: gaierror(11001, 'N
    o address found')
    [2019-10-21 14:01:21,227: WARNING/MainProcess] =========== 执行发送邮件 ===============
    [2019-10-21 14:01:21,255: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a]  ETA:[2019-10-21 06:01:24.22
    8790+00:00]
    [2019-10-21 14:01:21,264: INFO/MainProcess] Task celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a] retry: Retry in 3s: gaierror(11001, 'N
    o address found')
    [2019-10-21 14:01:24,243: WARNING/MainProcess] =========== 执行发送邮件 ===============
    [2019-10-21 14:01:24,280: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a]  ETA:[2019-10-21 06:01:27.24
    4729+00:00]
    [2019-10-21 14:01:24,291: INFO/MainProcess] Task celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a] retry: Retry in 3s: gaierror(11001, 'N
    o address found')
    [2019-10-21 14:01:27,245: WARNING/MainProcess] =========== 执行发送邮件 ===============
    [2019-10-21 14:01:27,271: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a]  ETA:[2019-10-21 06:01:30.24
    6720+00:00]
    [2019-10-21 14:01:27,281: INFO/MainProcess] Task celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a] retry: Retry in 3s: gaierror(11001, 'N
    o address found')
    [2019-10-21 14:01:30,261: WARNING/MainProcess] =========== 执行发送邮件 ===============
    [2019-10-21 14:01:30,279: ERROR/MainProcess] Task celery_tasks.tasks.send_register_active_email[7b921776-f6a6-4da0-9c71-b04aac0d139a] raised unexpected: gaierror(11001, 'N
    o address found')
    Traceback (most recent call last):
      ....
        raise socket.gaierror(socket.EAI_NONAME, 'No address found')
    socket.gaierror: [Errno 11001] No address found
    

    可以看到,上面的日志中的打印信息。
    第一次执行任务,则发送了一次报错。
    随后一直重试执行了5次都报错,说明重试的5次是从第一次执行失败后计算的。

    展开全文
  • azkaban失败任务批量

    千次阅读 2019-04-25 15:43:02
    id = b.id WHERE a.status = 70 and a.attempt=0 and a.start_time > 1551369601000 ORDER by b.name asc status =70 表示失败状态 attempt=0 表示试次数 start_time 查收时间段。1551369601000 为时间戳ms 可以在...

    其他接口可以参考官方文档 https://azkaban.readthedocs.io/en/latest/ajaxApi.html

    一、mydb查询失败数据(查出projectname和flowid)

    select b.name ,a.flow_id from execution_jobs a
    INNER JOIN projects b ON a.project_id = b.id
    WHERE a.status = 70
    and a.attempt=0
    and a.start_time > 1551369601000 ORDER by b.name asc
    

    status =70 表示失败状态
    attempt=0 表示重试次数
    start_time 查收时间段。1551369601000 为时间戳ms 可以在https://tool.lu/timestamp/ 进行转换

    在这里插入图片描述

    二、 拼接curl 命令

    2.1) 找到sessionid,sessionid这个id是用户登录azkaban的实时sessionid。

    2.2) 在Excel中拼接,(注意事项:下拉时候日期或者端口会递增,所有只能复制)

    curl -k --data "session.id=76ba04cb-c54a-4b43-b40c-590d1385c044&ajax=executeFlow&flowOverride[dt]=2019-03-01&project=azkabanProject&flow=azkabanFlows"  http://localhost:8088/executor?ajax=executeFlow
    

    在这里插入图片描述project 作业名称,sql查出来的name字段
    flow 流程名称,sql查出来的flow_id 字段

    在这里插入图片描述

    三、 登录azkaban服务器,直接执行所有拼接好的命令。

    执行及返回正确结果入下所示:

    [yuhui@hadoop11 ~]$ curl -k --data "session.id=76ba04cb-c54a-4b43-b40c-590d1385c044&ajax=executeFlow&flowOverride[dt]=2019-03-01&project=azkabanProject&flow=azkabanFlows"  http://localhost:8088/executor?ajax=executeFlow
    {
      "project" : "azkabanProject",
      "message" : "Execution submitted successfully with exec id 53890",
      "flow" : "azkabanFlows",
      "execid" : 53890
    }[yuhui@hadoop11 ~]
    

    之后去azkaban去查看运行的项目

    北京小辉微信公众号

    在这里插入图片描述

    大数据资料分享请关注
    展开全文
  • celery任务失败

    千次阅读 2019-04-22 16:54:46
    throw:试时是否通知worker是任务 eta:指定试的时间/日期 countdown:在多久之后试(每多少秒试一次) max_retries:最大试次数 bing=True后,task对象会作为第一个参数自动传入,可以...

    方式一:

    示例:

    @app.task(bind=True)
    def send_twitter_status(self, oauth, tweet):
        try:
            twitter = Twitter(oauth)
            twitter.update_status(tweet)
        except (Twitter.FailWhaleError, Twitter.LoginError) as exc:
            raise self.retry(exc=exc)
    

    retry的参数可以有:

    • exc:指定抛出的异常
    • throw:重试时是否通知worker是重试任务
    • eta:指定重试的时间/日期
    • countdown:在多久之后重试(每多少秒重试一次)
    • max_retries:最大重试次数

    bing=True后,task对象会作为第一个参数自动传入,可以使用任务对象的属性。例如:
    self.request.retries:当前重试的次数
    self.request还有以下属性:

    namedesc
    idThe unique id of the executing task
    groupThe unique id a group, if this task is a member.
    chordThe unique id of the chord this task belongs to (if the task is part of the header).
    argsPositional arguments.
    kwargsKeyword arguments.
    retriesHow many times the current task has been retried. An integer starting at 0.
    is_eagerSet to True if the task is executed locally in the client, and not by a worker.
    etaThe original ETA of the task (if any). This is in UTC time (depending on the CELERY_ENABLE_UTC setting).
    expiresThe original expiry time of the task (if any). This is in UTC time (depending on the CELERY_ENABLE_UTC setting).
    logfileThe file the worker logs to. See Logging.
    loglevelThe current log level used.
    hostnameHostname of the worker instance executing the task.
    delivery_infoAdditional message delivery information. This is a mapping containing the exchange and routing key used to deliver this task. Used by e.g. retry() to resend the task to the same destination queue. Availability of keys in this dict depends on the message broker used.
    called_directlyThis flag is set to true if the task was not executed by the worker.
    callbacksA list of subtasks to be called if this task returns successfully.
    errbackA list of subtasks to be called if this task fails.
    utcSet to true the caller has utc enabled (CELERY_ENABLE_UTC).

    方式二:

    @app.task(autoretry_for=(ReadTimeout,), retry_kwargs={'max_retries': 3, 'countdown': 5})
    def test_func():
        viewutils.test_func()
    

    在autoretry_for中添加要自动重试的异常,如果所有异常都需要重试可以写Exception,retry_kwargs中添加重试的参数。

    方式三:

    重写Task类

    from celery import Task
    
    class DebugTask(Task):
        abstract = True
    
        def after_return(self, *args, **kwargs):
            print('Task returned: {0!r}'.format(self.request)
    
    
    @app.task(base=DebugTask)
    def add(x, y):
        return x + y
    

    Handlers

    1. after_return(self, status, retval, task_id, args, kwargs, einfo)
      Handler called after the task returns.

      参数:

      • status – Current task state.
      • retval – Task return value/exception.
      • task_id – Unique id of the task.
      • args – Original arguments for the task that returned.
      • kwargs – Original keyword arguments for the task that returned.
      • einfo – ExceptionInfo instance, containing the traceback (if any).

      The return value of this handler is ignored.

    2. on_failure(self, exc, task_id, args, kwargs, einfo)
      This is run by the worker when the task fails.

      参数:

      • exc – The exception raised by the task.
      • task_id – Unique id of the failed task.
      • args – Original arguments for the task that failed.
      • kwargs – Original keyword arguments for the task that failed.
      • einfo – ExceptionInfo instance, containing the traceback.

      The return value of this handler is ignored.

    3. on_retry(self, exc, task_id, args, kwargs, einfo)
      This is run by the worker when the task is to be retried.

      参数:

      • exc – The exception sent to retry().
      • task_id – Unique id of the retried task.
      • args – Original arguments for the retried task.
      • kwargs – Original keyword arguments for the retried task.
      • einfo – ExceptionInfo instance, containing the traceback.

      The return value of this handler is ignored.

    4. on_success(self, retval, task_id, args, kwargs)
      Run by the worker if the task executes successfully.

      参数:

      • retval – The return value of the task.
      • task_id – Unique id of the executed task.
      • args – Original arguments for the executed task.
      • kwargs – Original keyword arguments for the executed task.

      The return value of this handler is ignored.

    展开全文
  • Azkaban任务失败试及试间隔命令

    千次阅读 2018-09-14 11:43:01
    Azkaban任务失败试及试间隔命令 在.job文件中,添加如下命令: retries=12 retry.backoff=300000
  • 任务调度系统--跑和断点续跑

    千次阅读 2019-09-18 09:34:23
    当一个任务的某一次调度在试了3次之后,仍然失败,那么这个任务的这一次调度就认为是失败的,当运维人员发现有失败的情况,登录到系统上查看,可以根据需要跑本次调度。 跑时,用户可...
  • azkaban配置任务失败

    千次阅读 2019-11-18 17:47:53
    retries=1 ##失败的job的自动试的次数 retry.backoff=10000 ##试的间隔(毫秒) 创建spring.job type=command command=echo "spring start... now is : ${azkaban.flow.start.year}-${azkaban.flow.start.month...
  • Airflow 跑dag中部分失败的任务

    千次阅读 2018-09-18 20:00:00
    跑dag中部分失败的任务 例如 dagA 中, T1 >> T2 >> T3 >> T4 >> T5 ,其中 T1 T2 成功, T3 失败, T4 T5因为依赖 T3,也不会运行。 跳过 T1 T2 跑 T3 T4 T5 的方法是: (1)点击 ...
  • 在不停服务的情况下,动态修改Spring定时任务的执行周期,即动态修改定时任务的cron参数。
  • 在项目时间目标已经确定的情况下如何采取行动来帮助时间目标达成?项目经理博客 1、项目成员加班赶工 毫无疑问,这是企业和项目经理采用的最普遍的方法。加班赶工能够争取时间,但同样危害多多。...
  • 前面的章节,用户通过绑定手机号的注册为会员,并可以补充完个人信息,比如姓名、生日等信息,拿到用户的生日信息之后,就可以通过会员生日信息进行营销,此处就涉及到定时任务执行营销信息推送的问题。本篇就带你...
  • 由于学校网络改造,我们告别了客户端登录的锐捷,迎来了PPPoE拨号的深澜,本以为新的认证计费系统能带来更...打开“任务计划程序”(Win10直接左下角搜就行,Win7去开始菜单搜),左侧选择“任务计划程序库”,右侧...
  • 分布式定时任务开源方案

    千次阅读 2022-03-25 23:35:29
    整理了常用的几种分布式定时任务开源方案的优缺点对比。
  • 大数据任务调度系统-Hera

    千次阅读 2020-01-07 20:23:17
    在大数据平台,随着业务发展,每天承载着成千上万的ETL(Extract-Transform-Load 数据抽取,转换,装载)任务调度,这些任务集中在hive,shell脚本调度。怎么样让大量的ETL任 务准确的完成调度而不出现问题,甚至在...
  • 2、打开“任务计划程序” 3、创建自动联网任务 ① 点击 创建基本任务 ② 输入 名称 然后点击 下一步 ; ③ 触发器 选择 当特定事件被记录时 ,然后点击 下一步 ; ④ 日志 选择 系统 ,源 输入 rasman ,事件 ID...
  • 最近接手一个项目,要把其中的阻塞任务队列,构成非阻塞。在客户端很少有机会直接处理任务队列。项目完成需要总结经验。 阻塞的发生 我这里先说明我遇到的阻塞问题,我这里的阻塞不是多线程访问的阻塞,概念上...
  • 导语:在前面我们讲过了阿里云分布式任务调度平台,今天我们从架构和技术实现上来为大家讲解腾讯云分布式任务调度系统TCT(Tencent CloudTask)如何实现任务调度的精准实时、稳定高效,以及任务的切分和编排。...
  • jenkins任务失败重新构建插件Naginator Plugin jenkins任务经常会因为一些偶然因素失败,这时重新构建一次就肯能成功;jenkins的Naginator Plugin插件可以重新调度构建失败的任务;Retry Failed Builds Plugin也...
  • xxl-job定时任务

    千次阅读 2022-01-27 14:26:11
    xxl-job定时任务的一点分享
  • Win11刚推出之后很多用户就迫不及待升级了Win10系统,升级之后发现很多功能都与之前的系统大相径庭,很多功能都不知道怎么使用,其实Win11的自定义功能比Win10还多,有的用户想要隐藏底部任务栏不知道怎么处理,下面...
  • 大家都知道我们安装好一个系统之后,系统的颜色都是默认的,有朋友说不喜欢win11系统的任务栏颜色,但是却不知道如何修改,其实方法不难,今天小编来跟大家说说win11任务栏颜色怎么改的步骤教程,大家一起来看看吧。...
  • iOS中如何触发定时任务或延时任务? 定时任务指的是周期性的调用某个方法,实现任务的反复执行,例如倒计时功能的实现;延时任务指的是等待一定时间后再执行某个任务,例如页面的延时跳转等。iOS中控制任务的延时或...
  • 更多windows11系统教程,可以参考小白装网。 Win11任务栏堆叠展开的设置教程 1、因为win11目前还只是预览版的系统,有不少的应用程序并不能完美在其中运行。 2、所以可能会出现如上图所示的右侧图标重叠的情况...
  • 分布式定时任务原理以及实现 一、单机指定时间执行定时任务实现方式 Timer运行机制 ScheduledThreadPoolExecutor的运行机制 原理图 Leader/Follower模式正在上传…重新上传取消 Timer和...
  • mapreduce中我们自定义的mapper和reducer程序在执行后有可能遇上出错退出的情况,mapreduce中jobtracker会全程追踪任务的执行情况,对于出错的任务mapreduce也定义了一套自己的处理方式。 首先要明确的是mapreduce...
  • r}'.format(task_id, exc)) # 任务成功时执行 def on_success(self, retval, task_id, args, kwargs): pass # 任务重试时执行 def on_retry(self, exc, task_id, args, kwargs, einfo): pass @task(base=MyTask) def...
  • 分布式定时任务解决方案

    千次阅读 2019-11-06 21:06:45
    分布式定时任务解决方案 一、背景 服务有定时任务,当服务部署到多个节点时,每个节点在同一个时间点都会执行相同的定时任务,需要做的是,让同一个时间点,每一个定时任务只在一个节点上执行,避免重复执行。 二、 ...
  • 定时任务:数据表设计与实现方案

    千次阅读 2019-10-31 18:02:12
    提醒任务ID提醒任务执行人ID任务执行人类别提醒周期提醒开始日期是否使用 提醒次数任务复用流程备用字段1备用字段2备用字段3备注 这个里的提醒周期表示的是每天每周每月等,或者说类似每天隔两小时提醒,像隔多少...
  • 在FreeRTOS中最最最主要的部分就是任务,FreeRTOS内部所有的东西基本都是为了任务而存在的。 在FreeRTOS中,一共提供了两种创建任务的形式:动态创建和静态创建。 让我先来看看创建任务的声明 /* 动态创建 */ #if( ...
  • Windows任务计划程序

    千次阅读 2019-05-02 19:50:24
    通常开发过程中,我们的windows控制台应用程序要想在windows中自动定时运行,windows任务计划程序是一个非常简便的选择。 步骤:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 531,669
精华内容 212,667
关键字:

任务虽重