在单独的队列/ worker上执行Celery的link_error回调

时间:2017-08-29 14:04:34

标签: python celery

我在2个不同的服务器上有2个应用程序,我们称之为A和B.两个应用程序都有一个Celery工作程序处于活动状态,侦听单独的队列(QueueA和QueueB)。

服务器B使用apply_async将任务推送到QueueB。

这是服务器B的任务:

@app.task(bind=True, queue="QueueB", name="name_on_server_A")
def taskForServerB():
   # nothing is executed here

@app.task(bind=True)
def success(result):
   print('Task succeeded')

@app.task(bind=True):
def failure(...):
   print('task failed')


taskForServerB.s().apply_async(link=success.s(), link_error=failure.s())

在服务器A上,任务name_on_server_A接收任务并执行它。如果成功完成,则任务success在ServerB上正确执行,但name_on_server_A失败,则不执行任务failure。相反,服务器A会为名为NotRegisteredError的任务抛出failure

我有什么遗失的吗?如何在ServerB上执行失败任务,在哪里调用第一个任务?

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

  1. 任务的路径到您为name_on_server_A定义的正确队列(带有queue分配) - 这是新的东西对我来说(我在芹菜配置中使用ROUTER,并将每个任务的名称路由到正确的队列。

  2. 当您定义芹菜应用时,您可能忘记包含任务failure,以便取消注册:

    app = Celery(broker ='amqp://',backend ='...',include = ['file1.py','file2.py',..])