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):
   #...