def as_task_v1(self, task_id, name, args=None, kwargs=None, countdown=None, eta=None, group_id=None, expires=None, retries=0, chord=None, callbacks=None, errbacks=None, reply_to=None, time_limit=None, soft_time_limit=None, create_sent_event=False, root_id=None, parent_id=None, shadow=None, now=None, timezone=None): args = args or () kwargs = kwargs or {} utc = self.utc if not isinstance(args, (list, tuple)): raise ValueError('task args must be a list or tuple') if not isinstance(kwargs, Mapping): raise ValueError('task keyword arguments must be a mapping') if countdown: # convert countdown to ETA now = now or self.app.now() timezone = timezone or self.app.timezone eta = now + timedelta(seconds=countdown) if utc: eta = to_utc(eta).astimezone(timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() timezone = timezone or self.app.timezone expires = now + timedelta(seconds=expires) if utc: expires = to_utc(expires).astimezone(timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() return task_message( headers={}, properties={ 'correlation_id': task_id, 'reply_to': reply_to or '', }, body={ 'task': name, 'id': task_id, 'args': args, 'kwargs': kwargs, 'retries': retries, 'eta': eta, 'expires': expires, 'utc': utc, 'callbacks': callbacks, 'errbacks': errbacks, 'timelimit': (time_limit, soft_time_limit), 'taskset': group_id, 'chord': chord, }, sent_event={ 'uuid': task_id, 'name': name, 'args': safe_repr(args), 'kwargs': safe_repr(kwargs), 'retries': retries, 'eta': eta, 'expires': expires, } if create_sent_event else None, )
def as_task_v1(self, task_id, name, args=None, kwargs=None, countdown=None, eta=None, group_id=None, expires=None, retries=0, chord=None, callbacks=None, errbacks=None, reply_to=None, time_limit=None, soft_time_limit=None, create_sent_event=False, root_id=None, parent_id=None, now=None, timezone=None): args = args or () kwargs = kwargs or {} utc = self.utc if not isinstance(args, (list, tuple)): raise ValueError('task args must be a list or tuple') if not isinstance(kwargs, Mapping): raise ValueError('task keyword arguments must be a mapping') if countdown: # convert countdown to ETA now = now or self.app.now() timezone = timezone or self.app.timezone eta = now + timedelta(seconds=countdown) if utc: eta = to_utc(eta).astimezone(timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() timezone = timezone or self.app.timezone expires = now + timedelta(seconds=expires) if utc: expires = to_utc(expires).astimezone(timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() return task_message( headers={}, properties={ 'correlation_id': task_id, 'reply_to': reply_to or '', }, body={ 'task': name, 'id': task_id, 'args': args, 'kwargs': kwargs, 'retries': retries, 'eta': eta, 'expires': expires, 'utc': utc, 'callbacks': callbacks, 'errbacks': errbacks, 'timelimit': (time_limit, soft_time_limit), 'taskset': group_id, 'chord': chord, }, sent_event={ 'uuid': task_id, 'name': name, 'args': safe_repr(args), 'kwargs': safe_repr(kwargs), 'retries': retries, 'eta': eta, 'expires': expires, } if create_sent_event else None, )
def test_expires_to_datetime(self): now = to_utc(datetime.utcnow()).astimezone(self.app.timezone) m = self.app.amqp.as_task_v2( uuid(), 'foo', expires=30, now=now, ) self.assertEqual( m.headers['expires'], (now + timedelta(seconds=30)).isoformat(), )
def test_countdown_to_eta(self): now = to_utc(datetime.utcnow()).astimezone(self.app.timezone) m = self.app.amqp.as_task_v2( uuid(), 'foo', countdown=10, now=now, ) self.assertEqual( m.headers['eta'], (now + timedelta(seconds=10)).isoformat(), )
def publish_task(self, task_name, task_args=None, task_kwargs=None, countdown=None, eta=None, task_id=None, group_id=None, taskset_id=None, # compat alias to group_id expires=None, exchange=None, exchange_type=None, event_dispatcher=None, retry=None, retry_policy=None, queue=None, now=None, retries=0, chord=None, callbacks=None, errbacks=None, routing_key=None, serializer=None, delivery_mode=None, compression=None, reply_to=None, time_limit=None, soft_time_limit=None, declare=None, headers=None, send_before_publish=signals.before_task_publish.send, before_receivers=signals.before_task_publish.receivers, send_after_publish=signals.after_task_publish.send, after_receivers=signals.after_task_publish.receivers, send_task_sent=signals.task_sent.send, # XXX deprecated sent_receivers=signals.task_sent.receivers, **kwargs): """Send task message.""" retry = self.retry if retry is None else retry headers = {} if headers is None else headers qname = queue if queue is None and exchange is None: queue = self.default_queue if queue is not None: if isinstance(queue, string_t): qname, queue = queue, self.queues[queue] else: qname = queue.name exchange = exchange or queue.exchange.name routing_key = routing_key or queue.routing_key if declare is None and queue and not isinstance(queue, Broadcast): declare = [queue] # merge default and custom policy retry = self.retry if retry is None else retry _rp = (dict(self.retry_policy, **retry_policy) if retry_policy else self.retry_policy) task_id = task_id or uuid() task_args = task_args or [] task_kwargs = task_kwargs or {} if not isinstance(task_args, (list, tuple)): raise ValueError('task args must be a list or tuple') if not isinstance(task_kwargs, dict): raise ValueError('task kwargs must be a dictionary') if countdown: # Convert countdown to ETA. now = now or self.app.now() eta = now + timedelta(seconds=countdown) if self.utc: eta = to_utc(eta).astimezone(self.app.timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() expires = now + timedelta(seconds=expires) if self.utc: expires = to_utc(expires).astimezone(self.app.timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() body = { 'task': task_name, 'id': task_id, 'args': task_args, 'kwargs': task_kwargs, 'retries': retries or 0, 'eta': eta, 'expires': expires, 'utc': self.utc, 'callbacks': callbacks, 'errbacks': errbacks, 'timelimit': (time_limit, soft_time_limit), 'taskset': group_id or taskset_id, 'chord': chord, } if before_receivers: send_before_publish( sender=task_name, body=body, exchange=exchange, routing_key=routing_key, declare=declare, headers=headers, properties=kwargs, retry_policy=retry_policy, ) self.publish( body, exchange=exchange, routing_key=routing_key, serializer=serializer or self.serializer, compression=compression or self.compression, headers=headers, retry=retry, retry_policy=_rp, reply_to=reply_to, correlation_id=task_id, delivery_mode=delivery_mode, declare=declare, **kwargs ) if after_receivers: send_after_publish(sender=task_name, body=body, exchange=exchange, routing_key=routing_key) if sent_receivers: # XXX deprecated send_task_sent(sender=task_name, task_id=task_id, task=task_name, args=task_args, kwargs=task_kwargs, eta=eta, taskset=group_id or taskset_id) if self.send_sent_event: evd = event_dispatcher or self.event_dispatcher exname = exchange or self.exchange if isinstance(exname, Exchange): exname = exname.name evd.publish( 'task-sent', { 'uuid': task_id, 'name': task_name, 'args': safe_repr(task_args), 'kwargs': safe_repr(task_kwargs), 'retries': retries, 'eta': eta, 'expires': expires, 'queue': qname, 'exchange': exname, 'routing_key': routing_key, }, self, retry=retry, retry_policy=retry_policy, ) return task_id
def as_task_v2(self, task_id, name, args=None, kwargs=None, countdown=None, eta=None, group_id=None, expires=None, retries=0, chord=None, callbacks=None, errbacks=None, reply_to=None, time_limit=None, soft_time_limit=None, create_sent_event=False, root_id=None, parent_id=None, shadow=None, chain=None, now=None, timezone=None): args = args or () kwargs = kwargs or {} utc = self.utc if not isinstance(args, (list, tuple)): raise TypeError('task args must be a list or tuple') if not isinstance(kwargs, Mapping): raise TypeError('task keyword arguments must be a mapping') if countdown: # convert countdown to ETA now = now or self.app.now() timezone = timezone or self.app.timezone eta = now + timedelta(seconds=countdown) if utc: eta = to_utc(eta).astimezone(timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() timezone = timezone or self.app.timezone expires = now + timedelta(seconds=expires) if utc: expires = to_utc(expires).astimezone(timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() argsrepr = saferepr(args) kwargsrepr = saferepr(kwargs) if JSON_NEEDS_UNICODE_KEYS: if callbacks: callbacks = [utf8dict(callback) for callback in callbacks] if errbacks: errbacks = [utf8dict(errback) for errback in errbacks] if chord: chord = utf8dict(chord) return task_message( headers={ 'lang': 'py', 'task': name, 'id': task_id, 'eta': eta, 'expires': expires, 'group': group_id, 'retries': retries, 'timelimit': [time_limit, soft_time_limit], 'root_id': root_id, 'parent_id': parent_id, 'argsrepr': argsrepr, 'kwargsrepr': kwargsrepr, }, properties={ 'correlation_id': task_id, 'reply_to': reply_to or '', }, body=( args, kwargs, { 'callbacks': callbacks, 'errbacks': errbacks, 'chain': chain, 'chord': chord, }, ), sent_event={ 'uuid': task_id, 'root_id': root_id, 'parent_id': parent_id, 'name': name, 'args': argsrepr, 'kwargs': kwargsrepr, 'retries': retries, 'eta': eta, 'expires': expires, } if create_sent_event else None, )
def as_task_v2(self, task_id, name, args=None, kwargs=None, countdown=None, eta=None, group_id=None, expires=None, retries=0, chord=None, callbacks=None, errbacks=None, reply_to=None, time_limit=None, soft_time_limit=None, create_sent_event=False, root_id=None, parent_id=None, shadow=None, chain=None, now=None, timezone=None): args = args or () kwargs = kwargs or {} utc = self.utc if not isinstance(args, (list, tuple)): raise TypeError('task args must be a list or tuple') if not isinstance(kwargs, Mapping): raise TypeError('task keyword arguments must be a mapping') if countdown: # convert countdown to ETA now = now or self.app.now() timezone = timezone or self.app.timezone eta = now + timedelta(seconds=countdown) if utc: eta = to_utc(eta).astimezone(timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() timezone = timezone or self.app.timezone expires = now + timedelta(seconds=expires) if utc: expires = to_utc(expires).astimezone(timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() argsrepr = saferepr(args) kwargsrepr = saferepr(kwargs) if JSON_NEEDS_UNICODE_KEYS: if callbacks: callbacks = [utf8dict(callback) for callback in callbacks] if errbacks: errbacks = [utf8dict(errback) for errback in errbacks] if chord: chord = utf8dict(chord) return task_message( headers={ 'lang': 'py', 'task': name, 'id': task_id, 'eta': eta, 'expires': expires, 'group': group_id, 'retries': retries, 'timelimit': [time_limit, soft_time_limit], 'root_id': root_id, 'parent_id': parent_id, 'argsrepr': argsrepr, 'kwargsrepr': kwargsrepr, }, properties={ 'correlation_id': task_id, 'reply_to': reply_to or '', }, body=( args, kwargs, { 'callbacks': callbacks, 'errbacks': errbacks, 'chain': chain, 'chord': chord, }, ), sent_event={ 'uuid': task_id, 'root': root_id, 'parent': parent_id, 'name': name, 'args': argsrepr, 'kwargs': kwargsrepr, 'retries': retries, 'eta': eta, 'expires': expires, } if create_sent_event else None, )
def publish_task( self, task_name, task_args=None, task_kwargs=None, countdown=None, eta=None, task_id=None, group_id=None, taskset_id=None, # compat alias to group_id expires=None, exchange=None, exchange_type=None, event_dispatcher=None, retry=None, retry_policy=None, queue=None, now=None, retries=0, chord=None, callbacks=None, errbacks=None, routing_key=None, serializer=None, delivery_mode=None, compression=None, reply_to=None, time_limit=None, soft_time_limit=None, declare=None, headers=None, send_before_publish=signals.before_task_publish.send, before_receivers=signals.before_task_publish.receivers, send_after_publish=signals.after_task_publish.send, after_receivers=signals.after_task_publish.receivers, send_task_sent=signals.task_sent.send, # XXX deprecated sent_receivers=signals.task_sent.receivers, **kwargs): """Send task message.""" retry = self.retry if retry is None else retry headers = {} if headers is None else headers qname = queue if queue is None and exchange is None: queue = self.default_queue if queue is not None: if isinstance(queue, string_t): qname, queue = queue, self.queues[queue] else: qname = queue.name exchange = exchange or queue.exchange.name routing_key = routing_key or queue.routing_key if declare is None and queue and not isinstance(queue, Broadcast): declare = [queue] # merge default and custom policy retry = self.retry if retry is None else retry _rp = (dict(self.retry_policy, **retry_policy) if retry_policy else self.retry_policy) task_id = task_id or uuid() task_args = task_args or [] task_kwargs = task_kwargs or {} if not isinstance(task_args, (list, tuple)): raise ValueError('task args must be a list or tuple') if not isinstance(task_kwargs, dict): raise ValueError('task kwargs must be a dictionary') if countdown: # Convert countdown to ETA. now = now or self.app.now() eta = now + timedelta(seconds=countdown) if self.utc: eta = to_utc(eta).astimezone(self.app.timezone) if isinstance(expires, (int, float)): now = now or self.app.now() expires = now + timedelta(seconds=expires) if self.utc: expires = to_utc(expires).astimezone(self.app.timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() body = { 'task': task_name, 'id': task_id, 'args': task_args, 'kwargs': task_kwargs, 'retries': retries or 0, 'eta': eta, 'expires': expires, 'utc': self.utc, 'callbacks': callbacks, 'errbacks': errbacks, 'timelimit': (time_limit, soft_time_limit), 'taskset': group_id or taskset_id, 'chord': chord, } if before_receivers: send_before_publish( sender=task_name, body=body, exchange=exchange, routing_key=routing_key, declare=declare, headers=headers, properties=kwargs, retry_policy=retry_policy, ) self.publish(body, exchange=exchange, routing_key=routing_key, serializer=serializer or self.serializer, compression=compression or self.compression, headers=headers, retry=retry, retry_policy=_rp, reply_to=reply_to, correlation_id=task_id, delivery_mode=delivery_mode, declare=declare, **kwargs) if after_receivers: send_after_publish(sender=task_name, body=body, exchange=exchange, routing_key=routing_key) if sent_receivers: # XXX deprecated send_task_sent(sender=task_name, task_id=task_id, task=task_name, args=task_args, kwargs=task_kwargs, eta=eta, taskset=group_id or taskset_id) if self.send_sent_event: evd = event_dispatcher or self.event_dispatcher exname = exchange or self.exchange if isinstance(exname, Exchange): exname = exname.name evd.publish( 'task-sent', { 'uuid': task_id, 'name': task_name, 'args': safe_repr(task_args), 'kwargs': safe_repr(task_kwargs), 'retries': retries, 'eta': eta, 'expires': expires, 'queue': qname, 'exchange': exname, 'routing_key': routing_key, }, self, retry=retry, retry_policy=retry_policy, ) return task_id
def as_task_v1( self, task_id, name, args=None, kwargs=None, countdown=None, eta=None, group_id=None, expires=None, retries=0, chord=None, callbacks=None, errbacks=None, reply_to=None, time_limit=None, soft_time_limit=None, create_sent_event=False, root_id=None, parent_id=None, now=None, timezone=None, ): args = args or () kwargs = kwargs or {} utc = self.utc if not isinstance(args, (list, tuple)): raise ValueError("task args must be a list or tuple") if not isinstance(kwargs, Mapping): raise ValueError("task keyword arguments must be a mapping") if countdown: # convert countdown to ETA now = now or self.app.now() timezone = timezone or self.app.timezone eta = now + timedelta(seconds=countdown) if utc: eta = to_utc(eta).astimezone(timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() timezone = timezone or self.app.timezone expires = now + timedelta(seconds=expires) if utc: expires = to_utc(expires).astimezone(timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() return task_message( headers={}, properties={"correlation_id": task_id, "reply_to": reply_to or ""}, body={ "task": name, "id": task_id, "args": args, "kwargs": kwargs, "retries": retries, "eta": eta, "expires": expires, "utc": utc, "callbacks": callbacks, "errbacks": errbacks, "timelimit": (time_limit, soft_time_limit), "taskset": group_id, "chord": chord, }, sent_event={ "uuid": task_id, "name": name, "args": safe_repr(args), "kwargs": safe_repr(kwargs), "retries": retries, "eta": eta, "expires": expires, } if create_sent_event else None, )
def as_task_v2( self, task_id, name, args=None, kwargs=None, countdown=None, eta=None, group_id=None, expires=None, retries=0, chord=None, callbacks=None, errbacks=None, reply_to=None, time_limit=None, soft_time_limit=None, create_sent_event=False, root_id=None, parent_id=None, shadow=None, chain=None, now=None, timezone=None, ): args = args or () kwargs = kwargs or {} utc = self.utc if not isinstance(args, (list, tuple)): raise TypeError("task args must be a list or tuple") if not isinstance(kwargs, Mapping): raise TypeError("task keyword arguments must be a mapping") if countdown: # convert countdown to ETA now = now or self.app.now() timezone = timezone or self.app.timezone eta = now + timedelta(seconds=countdown) if utc: eta = to_utc(eta).astimezone(timezone) if isinstance(expires, numbers.Real): now = now or self.app.now() timezone = timezone or self.app.timezone expires = now + timedelta(seconds=expires) if utc: expires = to_utc(expires).astimezone(timezone) eta = eta and eta.isoformat() expires = expires and expires.isoformat() argsrepr = saferepr(args) kwargsrepr = saferepr(kwargs) if JSON_NEEDS_UNICODE_KEYS: if callbacks: callbacks = [utf8dict(callback) for callback in callbacks] if errbacks: errbacks = [utf8dict(errback) for errback in errbacks] if chord: chord = utf8dict(chord) return task_message( headers={ "lang": "py", "task": name, "id": task_id, "eta": eta, "expires": expires, "group": group_id, "retries": retries, "timelimit": [time_limit, soft_time_limit], "root_id": root_id, "parent_id": parent_id, "argsrepr": argsrepr, "kwargsrepr": kwargsrepr, }, properties={"correlation_id": task_id, "reply_to": reply_to or ""}, body=(args, kwargs, {"callbacks": callbacks, "errbacks": errbacks, "chain": chain, "chord": chord}), sent_event={ "uuid": task_id, "root_id": root_id, "parent_id": parent_id, "name": name, "args": argsrepr, "kwargs": kwargsrepr, "retries": retries, "eta": eta, "expires": expires, } if create_sent_event else None, )