2012-02-01 31 views
0

私は、サードパーティのサービスから、最初のリクエストが失敗し、再試行する必要があることを示す応答を受け取る状況があります。私はセロリの仕事でサービスを呼んでいます。再試行の呼び出しは例外では捕捉されず、ブローカにタスクの新しいインスタンスを渡して現在のタスクを続行するのではなく、そのタスクをブローカに渡してタスクを終了するように見えます。再試行を設定して現在のタスクを続行する方法はありますか?Django Celery retry()タスク現在のタスクを続行します

答えて

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) 

あなたは現在のタスクが再試行状態にあるとしてマークされることはありません例外を発生させない場合は、 しかし中残りのタスクが成功するかどうかによって、SUCCESS/FAILURE状態になります。 再試行タスクは現在のタスクと同じuuidを共有するため、新しいタスクが現在のタスクの前に戻ると、現在のタスクは新しいタスクの結果を上書きできます。 これはもちろん、タスクの結果を無視しても問題ありません。

それは意味がありますか?

0

私のコードは少し異なります。この場合、メッセージを送信する受信者のリストをループするセロリのタスクがあります。送信呼び出しのいずれかが失敗した場合、セロリタスクを終了したくない代わりに、他の受信者と続行します。

これは私のケースではtask.retry(throw = False)では起こりません。私は、その時点でタスクを終了していないと言っています。

+0

あなたはたぶん、あなたが捕捉している 'SMTPException'よりも別の例外が発生しているので、再試行も 'blah'にも到達していません – Anentropic

関連する問題