Celery のリトライ処理での例外

Celery のリトライ処理で、最大リトライ数を超えると最終的にどこから例外が送出されるのか混乱してしまったので調査した。

class CustomException(Exception):
    pass

@app.task(bind=True)
def task_func(self):
    print("task_func starts")
    try:
        raise CustomException()
    except CustomException as e:
        try:
            raise self.retry(countdown=3, exc=e, max_retries=2)
            # 上のように明示的に raise しなければいけないと思ってたけど、次のようになくても OK だった。
            # self.retry(countdown=3, exc=e, max_retries=2)
        except CustomException:
            print("self.retry() raised a CustomException")
            raise
        except celery.exceptions.Retry:
            print("self.retry() raised a Retry (%d)" % (self.request.retries + 1))
            raise   # この Retry 例外は raise し直さくてもリトライされるので、この行はなくてもよい。
    finally:
        print("task_func ends")

上の調査用タスク関数を用意して、task_func.dalay() で Celery ワーカーに実行させたところ、以下のようなログが出力された。
最大リトライ数を超えたとき(上記例だと 3 回目に retry 実行するとき)に self.retry()exe 引数で受け取った例外オブジェクトを送出している。

[2015-12-23 21:40:19,992: WARNING/MainProcess] celery@otsuka-mbp.local ready.
[2015-12-23 21:40:21,723: INFO/MainProcess] Received task: web.tasks.task_func[7900062e-f3e8-4fa6-be31-b1b7c700ac3c]
[2015-12-23 21:40:21,725: WARNING/Worker-3] task_func starts
[2015-12-23 21:40:21,773: WARNING/Worker-3] self.retry() raised a Retry (1)
[2015-12-23 21:40:21,773: WARNING/Worker-3] task_func ends
[2015-12-23 21:40:21,790: INFO/MainProcess] Received task: web.tasks.task_func[7900062e-f3e8-4fa6-be31-b1b7c700ac3c] eta:[2015-12-23 21:40:24.735310+09:00]
[2015-12-23 21:40:21,791: INFO/MainProcess] Task web.tasks.task_func[7900062e-f3e8-4fa6-be31-b1b7c700ac3c] retry: Retry in 3s: CustomException()
[2015-12-23 21:40:24,984: WARNING/Worker-1] task_func starts
[2015-12-23 21:40:25,036: WARNING/Worker-1] self.retry() raised a Retry (2)
[2015-12-23 21:40:25,037: WARNING/Worker-1] task_func ends
[2015-12-23 21:40:25,038: INFO/MainProcess] Received task: web.tasks.task_func[7900062e-f3e8-4fa6-be31-b1b7c700ac3c] eta:[2015-12-23 21:40:27.994043+09:00]
[2015-12-23 21:40:25,042: INFO/MainProcess] Task web.tasks.task_func[7900062e-f3e8-4fa6-be31-b1b7c700ac3c] retry: Retry in 3s: CustomException()
[2015-12-23 21:40:28,963: WARNING/Worker-2] task_func starts
[2015-12-23 21:40:28,964: WARNING/Worker-2] self.retry() raised a CustomException
[2015-12-23 21:40:28,964: WARNING/Worker-2] task_func ends
[2015-12-23 21:40:28,974: ERROR/MainProcess] Task web.tasks.task_func[7900062e-f3e8-4fa6-be31-b1b7c700ac3c] raised unexpected: CustomException()
Last updated on December 23, 2015