django-celeryをさわってみたメモ2 - リトライ
django-celeryでリトライをさせるにはどうするのか知りたくて、ドキュメント読みながら動かしてみたのでメモ
以下のようにtaskデコレータをつけた関数内で、関数名.retryを呼ぶことで処理が再実行されます。
from celery import task from celery.utils.log import get_task_logger class MyError(Exception): pass logger = get_task_logger(__name__) @task() def add(x, y): logger.info("add called") try: complex_function() except Exception, e: add.retry() return x + y def complex_function(): if True: raise MyError('error')
リトライ回数を制限するにはtaskデコレータにmax_retriesオプションをわたします
max_retriesを超えてretryが呼ばれた場合はMaxRetriesExceededErrorが発生します
@task(max_retries=3) def add(x, y): try: complex_function() except Exception, e: try: add.retry() except add.MaxRetriesExceededError, e: logger.error("max retries exceed") return x + y
また、リトライ処理はデフォルトでは180秒後に実行されますが、リトライ間隔を指定する場合は、taskデコレータにdefault_retry_delayオプションをわたします
@task(max_retries=3, default_retry_delay=5) def add(x, y): #...