2012-02-01 99 views
0

我有一種情況,我收到來自第三方服務的響應,指示我的初始請求失敗,我應該重試。我在Celery任務中調用該服務。重試呼叫不會在異常中捕獲,似乎不是將任務的新實例提供給代理,而是繼續執行當前任務,它將任務交給代理並退出任務。有沒有辦法設置重試並繼續執行當前任務?Django芹菜重試()任務,但繼續當前任務

回答

1

task.retry引發RetryTaskError異常,該異常用於檢測任務是否被重試。看到這裏注:http://docs.celeryproject.org/en/latest/userguide/tasks.html#retrying-a-task-if-something-fails

您可以跳過此行爲,通過使用throw=False

task.retry(throw=False) 
# do something else 
raise RetryTaskError(None, None) 

如果不引發異常的當前任務將不會被標記爲重試狀態, 但在成功/失敗狀態取決於任務的其餘部分是否成功。 由於重試任務將與當前任務共享相同的uuid,因此如果新任務在當前任務之前返回,則當前任務可以覆蓋新任務的結果。 這當然,無論如何你都忽略了任務的結果並不重要。

這有道理嗎?

0

我的代碼略有不同。在這種情況下,我有一個芹菜任務,循環接收者列表來發送消息。如果任何發送呼叫失敗,我不希望芹菜任務退出,而是繼續與其他接收者。

在我的情況下,這不會發生在task.retry(throw = False)上。我確實看到這個任務正在退出,而沒有做任何事情。

@celery_app.task() 
def send_msg_to_list(): 
    for recvr in Emailrecvr.objects.filter(query=obj): 
     try: 
      email_rv = recvr.send(msg) 
     except SMTPException: 
      # Dont exit the loop but continue with others 
      send_msg_to_list.retry(throw=False) 
    # do some blah here 
+0

你可能會得到一個不同於你正在捕獲的'SMTPException'的異常,所以既沒有重試也沒有'blah' – Anentropic 2017-07-25 15:51:10