我在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上执行失败任务,该任务是从哪里调用的?
这里有两个问题:
-
任务的路由您为
name_on_server_A
定义的正确队列(带有queue
分配) - 这是对我来说是新事物(我正在使用路由器)在芹菜配置中,并将每个任务以其名称的名称路由到右队列。 -
定义芹菜应用程序时,您可能会忘记包含任务
failure
,因此它没有注册:app =芹菜(broker ='amqp://',backend ='...',include = ['file1.py','file2.py',..])