|
@@ -130,6 +130,14 @@ class Queues(UserDict):
|
|
|
|
|
|
class TaskPublisher(messaging.Publisher):
|
|
|
auto_declare = False
|
|
|
+ retry = False
|
|
|
+ retry_policy = None
|
|
|
+
|
|
|
+ def __init__(self, *args, **kwargs):
|
|
|
+ self.retry = kwargs.pop("retry", self.retry)
|
|
|
+ self.retry_policy = kwargs.pop("retry_policy",
|
|
|
+ self.retry_policy or {})
|
|
|
+ super(TaskPublisher, self).__init__(*args, **kwargs)
|
|
|
|
|
|
def declare(self):
|
|
|
if self.exchange.name not in _exchanges_declared:
|
|
@@ -139,7 +147,7 @@ class TaskPublisher(messaging.Publisher):
|
|
|
def delay_task(self, task_name, task_args=None, task_kwargs=None,
|
|
|
countdown=None, eta=None, task_id=None, taskset_id=None,
|
|
|
expires=None, exchange=None, exchange_type=None,
|
|
|
- event_dispatcher=None, **kwargs):
|
|
|
+ event_dispatcher=None, retry=None, retry_policy=None, **kwargs):
|
|
|
"""Send task message."""
|
|
|
|
|
|
task_id = task_id or gen_unique_id()
|
|
@@ -163,7 +171,7 @@ class TaskPublisher(messaging.Publisher):
|
|
|
eta = eta and eta.isoformat()
|
|
|
expires = expires and expires.isoformat()
|
|
|
|
|
|
- message_data = {
|
|
|
+ body = {
|
|
|
"task": task_name,
|
|
|
"id": task_id,
|
|
|
"args": task_args or [],
|
|
@@ -174,7 +182,7 @@ class TaskPublisher(messaging.Publisher):
|
|
|
}
|
|
|
|
|
|
if taskset_id:
|
|
|
- message_data["taskset"] = taskset_id
|
|
|
+ body["taskset"] = taskset_id
|
|
|
|
|
|
# custom exchange passed, need to declare it.
|
|
|
if exchange and exchange not in _exchanges_declared:
|
|
@@ -184,10 +192,15 @@ class TaskPublisher(messaging.Publisher):
|
|
|
durable=self.durable,
|
|
|
auto_delete=self.auto_delete)
|
|
|
_exchanges_declared.add(exchange)
|
|
|
- self.send(message_data, exchange=exchange,
|
|
|
- **extract_msg_options(kwargs))
|
|
|
- signals.task_sent.send(sender=task_name, **message_data)
|
|
|
|
|
|
+ send = self.send
|
|
|
+ if retry is None and self.retry or retry:
|
|
|
+ send = self.connection.ensure(self, self.send,
|
|
|
+ **dict(self.retry_policy, **retry_policy or {}))
|
|
|
+
|
|
|
+ send(body, exchange=exchange, **extract_msg_options(kwargs))
|
|
|
+
|
|
|
+ signals.task_sent.send(sender=task_name, **body)
|
|
|
if event_dispatcher:
|
|
|
event_dispatcher.send("task-sent", uuid=task_id,
|
|
|
name=task_name,
|
|
@@ -240,11 +253,14 @@ class AMQP(object):
|
|
|
You should use `app.send_task` instead.
|
|
|
|
|
|
"""
|
|
|
+ conf = self.app.conf
|
|
|
_, default_queue = self.get_default_queue()
|
|
|
defaults = {"exchange": default_queue["exchange"],
|
|
|
"exchange_type": default_queue["exchange_type"],
|
|
|
- "routing_key": self.app.conf.CELERY_DEFAULT_ROUTING_KEY,
|
|
|
- "serializer": self.app.conf.CELERY_TASK_SERIALIZER}
|
|
|
+ "routing_key": conf.CELERY_DEFAULT_ROUTING_KEY,
|
|
|
+ "serializer": conf.CELERY_TASK_SERIALIZER,
|
|
|
+ "retry": conf.CELERY_TASK_PUBLISH_RETRY,
|
|
|
+ "retry_policy": conf.CELERY_TASK_PUBLISH_RETRY_POLICY}
|
|
|
publisher = TaskPublisher(*args,
|
|
|
**self.app.merge(defaults, kwargs))
|
|
|
|