在单独的队列/工作线程上执行 Celery 的link_error回调



我在2个单独的服务器上有2个应用程序,我们称它们为A和B。两个应用程序都有一个芹菜工人活动,然后聆听单独的队列(queuea和queueb)。

服务器B使用apply_async将任务推向排队。

这是服务器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接收任务并执行任务。如果成功完成,则在ServerB上正确执行任务success,但name_on_server_A失败,任务failure未执行。相反,服务器a为具有名称failure的任务抛出NotRegisteredError

我缺少什么吗?如何在serverb上执行失败任务,该任务是从哪里调用的?

这里有两个问题:

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

  2. 定义芹菜应用程序时,您可能会忘记包含任务failure,因此它没有注册:

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

相关内容

  • 没有找到相关文章

最新更新