我在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上执行失败任务,在哪里调用第一个任务?
答案 0 :(得分:0)
这里有两个问题:
任务的路径到您为name_on_server_A
定义的正确队列(带有queue
分配) - 这是新的东西对我来说(我在芹菜配置中使用ROUTER,并将每个任务的名称路由到正确的队列。
当您定义芹菜应用时,您可能忘记包含任务failure
,以便取消注册:
app = Celery(broker ='amqp://',backend ='...',include = ['file1.py','file2.py',..])