def from_message(cls, message, message_data, on_ack=noop, logger=None, eventer=None, hostname=None): """Create a :class:`TaskRequest` from a task message sent by :class:`celery.messaging.TaskPublisher`. :raises UnknownTaskError: if the message does not describe a task, the message is also rejected. :returns :class:`TaskRequest`: """ task_name = message_data["task"] task_id = message_data["id"] args = message_data["args"] kwargs = message_data["kwargs"] retries = message_data.get("retries", 0) eta = maybe_iso8601(message_data.get("eta")) expires = maybe_iso8601(message_data.get("expires")) _delivery_info = getattr(message, "delivery_info", {}) delivery_info = dict((key, _delivery_info.get(key)) for key in WANTED_DELIVERY_INFO) if not hasattr(kwargs, "items"): raise InvalidTaskError("Task kwargs must be a dictionary.") return cls(task_name, task_id, args, kwdict(kwargs), retries=retries, on_ack=on_ack, delivery_info=delivery_info, logger=logger, eventer=eventer, hostname=hostname, eta=eta, expires=expires)
return datetime.fromtimestamp(heartbeat) def handle_worker(self, (hostname, worker)): return self.WorkerState.objects.update_or_create( hostname=hostname, defaults={"last_heartbeat": self.get_heartbeat(worker)}) def handle_task(self, (uuid, task), worker=None): if task.worker.hostname: worker = self.handle_worker((task.worker.hostname, task.worker)) return self.update_task(task.state, task_id=uuid, defaults={"name": task.name, "args": task.args, "kwargs": task.kwargs, "eta": maybe_iso8601(task.eta), "expires": maybe_iso8601(task.expires), "state": task.state, "tstamp": datetime.fromtimestamp(task.timestamp), "result": task.result or task.exception, "traceback": task.traceback, "runtime": task.runtime, "worker": worker}) def update_task(self, state, **kwargs): objects = self.TaskState.objects defaults = kwargs.pop("defaults", None) or {} try: obj = objects.get(**kwargs) except ObjectDoesNotExist: if not defaults.get("name"):
return obj def handle_task(self, (uuid, task), worker=None): if task.worker and task.worker.hostname: worker = self.handle_worker((task.worker.hostname, task.worker)) return self.update_task(task.state, task_id=uuid, defaults={ "name": task.name, "args": task.args, "kwargs": task.kwargs, "eta": maybe_iso8601(task.eta), "expires": maybe_iso8601(task.expires), "state": task.state, "tstamp": datetime.fromtimestamp(task.timestamp), "result": task.result or task.exception, "traceback": task.traceback, "runtime": task.runtime, "worker": worker })