2017-08-29 43 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',..])