|
5 | 5 | from contextlib import ExitStack |
6 | 6 | from datetime import timedelta |
7 | 7 |
|
| 8 | +from dateutil.relativedelta import relativedelta |
8 | 9 | from django.conf import settings |
9 | 10 | from django.utils import timezone |
10 | 11 |
|
11 | 12 | from task_processor import metrics |
| 13 | +from task_processor.exceptions import TaskBackoffError |
12 | 14 | from task_processor.managers import RecurringTaskManager, TaskManager |
13 | 15 | from task_processor.models import ( |
14 | 16 | AbstractBaseTask, |
@@ -120,6 +122,7 @@ def _run_task( |
120 | 122 | ctx.enter_context(timer) |
121 | 123 |
|
122 | 124 | task_identifier = task.task_identifier |
| 125 | + registered_task = get_task(task_identifier) |
123 | 126 |
|
124 | 127 | logger.debug( |
125 | 128 | f"Running task {task_identifier} id={task.pk} args={task.args} kwargs={task.kwargs}" |
@@ -157,9 +160,24 @@ def _run_task( |
157 | 160 | exc_info=True, |
158 | 161 | ) |
159 | 162 |
|
| 163 | + if isinstance(e, TaskBackoffError): |
| 164 | + delay_until = e.delay_until or timezone.now() + relativedelta( |
| 165 | + seconds=settings.TASK_BACKOFF_DEFAULT_SECONDS, |
| 166 | + ) |
| 167 | + registered_task.task_handler.delay( |
| 168 | + delay_until=delay_until, |
| 169 | + args=task.args, |
| 170 | + kwargs=task.kwargs, |
| 171 | + ) |
| 172 | + logger.info( |
| 173 | + "Backoff requested. Task '%s' set to retry at %s", |
| 174 | + task_identifier, |
| 175 | + delay_until, |
| 176 | + ) |
| 177 | + |
160 | 178 | labels = { |
161 | 179 | "task_identifier": task_identifier, |
162 | | - "task_type": get_task(task_identifier).task_type.value.lower(), |
| 180 | + "task_type": registered_task.task_type.value.lower(), |
163 | 181 | "result": result.lower(), |
164 | 182 | } |
165 | 183 |
|
|
0 commit comments