2016-11-28 200 views
0

有没有办法在运行时修改芹菜任务的重试延迟?还是有一个全局配置值可以改变来覆盖180s的默认值?在运行时更改celery任务的default_retry_delay?

我已经设置了指数回退任务(如此处所述:Retry Celery tasks with exponential back off),但我想在集成测试时重写此值。

原因是,如果在异常处理程序中引发异常,这似乎绕过并忽略了倒计时参数,我通常最终会触发180s的默认值。

class BaseTask(celery.Task): 
    def on_retry(self, exc, task_id, args, kwargs, einfo): 
     """Log the exceptions at retry.""" 
     logger.exception(exc) 
     logger.warning('Retry: {}.'.format(self.request)) 
     super().on_retry(exc, task_id, args, kwargs, einfo) 

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     """Log the exceptions on failure.""" 
     logger.exception(exc) 
     logger.error('Failure: {}.'.format(self.request)) 
     super().on_failure(exc, task_id, args, kwargs, einfo) 

    @property 
    def backoff_countdown(self): 
     return int(random.uniform(2, 4) ** self.request.retries) 

@celery.task(bind=True, base=BaseTask) 
def process(self, data): 
    try: 
     return some_task(data) 
    except Exception as exc: 
     raise self.retry(exc=exc, coundown=self.backoff_countdown) 

不管有什么事self.backoff_countdown设置(甚至只是返回1)我结束了任务正在重试中180s,这使得它真的很难运行与合理的超时集成测试。

回答

0

请参阅文档http://docs.celeryproject.org/en/latest/userguide/tasks.html#using-a-custom-retry-delay,可以设置default_retry_delay或设置倒计时值。

@celery.task(bind=True, default_retry_delay=30 * 60) # retry in 30 minutes. 
def process(self, data): 
    try: 
     return some_task(data) 
    except Exception as exc: 
     # Retry in 5 minutes 
     raise self.retry(exc=exc, countdown=5 * 60) 
+0

是的,我知道那个设置,但它不是我在运行时可以改变的东西 - 至少不是我能看到的。 也许我说的很糟糕。我很满意3分钟的正常重试延迟,我不想在源代码中改变它。但是,当我通过一些我可以注入的配置设置或通过添加到我的测试中的某些仪器设置在泊坞窗镜像中运行此相同源时,我确实希望覆盖该值。 – sas

+0

如何覆盖Task对象的重试方法? – Jinje

+0

此代码正在泊坞窗容器中运行。我能做的最好的是注入配置文件或设置env变量。我想我可以尝试通过一个env变量为'@ celery.task(... default_retry_delay = ...)'注入一个值,但这看起来非常复杂,并不是我想要发布的东西。 – sas

相关问题