2017-08-29 46 views
0

我在2个独立的服务器上有2个应用程序,我们称它们为A和B.这两个应用程序都有一个Celery工作程序处于活动状态,监听单独的队列(QueueA和QueueB)。在单独的队列/工作者上执行芹菜的link_error回调

服务器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为名称为failure的任务引发NotRegisteredError

有什么我失踪?我怎样才能让失败任务在ServerB上执行,其中第一个任务是从哪里调用的?

回答

0

这里有两个问题:任务

  1. 路线到您name_on_server_A定义(与queue分配)正确的队列 - 这是东西的方式,对我来说是新的(我使用的路由器芹菜配置和路由每个任务由它的名字的权利队列

  2. 当你定义你的芹菜应用程序,你可能忘了,包括任务failure所以注销。

    应用程式=芹菜(经纪人= 'AMQP://',后端= '... '包括= [' file1.py', 'file2.py',..])