def route(self, options, task, args=(), kwargs={}): options = self.expand_destination(options) # expands 'queue' if self.routes: route = self.lookup_route(task, args, kwargs) if route: # expands 'queue' in route. return lpmerge(self.expand_destination(route), options) if "queue" not in options: options = lpmerge(self.expand_destination(self.app.conf.CELERY_DEFAULT_QUEUE), options) return options
def route(self, options, task, args=(), kwargs={}): options = self.expand_destination(options) # expands 'queue' if self.routes: route = self.lookup_route(task, args, kwargs, options) if route: # expands 'queue' in route. return lpmerge(self.expand_destination(route), options) if 'queue' not in options: options = lpmerge(self.expand_destination( self.app.conf.task_default_queue), options) return options
def route(self, options, task, args=(), kwargs={}): options = self.expand_destination(options) # expands 'queue' if self.routes: route = self.lookup_route(task, args, kwargs) if route: # expands 'queue' in route. return lpmerge(self.expand_destination(route), options) if 'queue' not in options: options = lpmerge(self.expand_destination( self.app.conf.CELERY_DEFAULT_QUEUE), options) return options
def expand_destination(self, route): # Route can be a queue name: convenient for direct exchanges. if isinstance(route, basestring): queue, route = route, {} else: # can use defaults from configured queue, but override specific # things (like the routing_key): great for topic exchanges. queue = route.pop("queue", None) if queue: # expand config from configured queue. try: dest = dict(self.queues[queue]) except KeyError: if not self.create_missing: raise QueueNotFound( "Queue %r is not defined in CELERY_QUEUES" % queue) for key in "exchange", "routing_key": if route.get(key) is None: route[key] = queue dest = dict(self.app.amqp.queues.add(queue, **route)) # needs to be declared by publisher dest["queue"] = queue # routing_key and binding_key are synonyms. dest.setdefault("routing_key", dest.get("binding_key")) return lpmerge(dest, route) return route
def route(self, options, task, args=(), kwargs={}): options = self.expand_destination(options) # expands 'queue' if self.routes: route = self.lookup_route(task, args, kwargs) if route: # expands 'queue' in route. return lpmerge(self.expand_destination(route), options) return options
def TaskPublisher(self, *args, **kwargs): """Returns publisher used to send tasks. 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": conf.CELERY_DEFAULT_ROUTING_KEY, "serializer": conf.CELERY_TASK_SERIALIZER, "compression": conf.CELERY_MESSAGE_COMPRESSION, "retry": conf.CELERY_TASK_PUBLISH_RETRY, "retry_policy": conf.CELERY_TASK_PUBLISH_RETRY_POLICY, "enable_utc": conf.CELERY_ENABLE_UTC, "app": self.app} return TaskPublisher(*args, **lpmerge(defaults, kwargs))
def expand_destination(self, route): # Route can be a queue name: convenient for direct exchanges. if isinstance(route, string_t): queue, route = route, {} else: # can use defaults from configured queue, but override specific # things (like the routing_key): great for topic exchanges. queue = route.pop('queue', None) if queue: # expand config from configured queue. try: dest = self.queues[queue].as_dict() except KeyError: if not self.create_missing: raise QueueNotFound( 'Queue {0!r} missing from CELERY_QUEUES'.format(queue)) for key in 'exchange', 'routing_key': if route.get(key) is None: route[key] = queue dest = self.app.amqp.queues.add(queue, **route).as_dict() # needs to be declared by publisher dest['queue'] = queue return lpmerge(dest, route) return route
def expand_destination(self, route): # Route can be a queue name: convenient for direct exchanges. if isinstance(route, basestring): queue, route = route, {} else: # can use defaults from configured queue, but override specific # things (like the routing_key): great for topic exchanges. queue = route.pop('queue', None) if queue: # expand config from configured queue. try: dest = self.queues[queue].as_dict() except KeyError: if not self.create_missing: raise QueueNotFound( 'Queue %r is not defined in CELERY_QUEUES' % queue) for key in 'exchange', 'routing_key': if route.get(key) is None: route[key] = queue dest = self.app.amqp.queues.add(queue, **route).as_dict() # needs to be declared by publisher dest['queue'] = queue return lpmerge(dest, route) return route
def merge(self, l, r): """Like `dict(a, **b)` except it will keep values from `a` if the value in `b` is :const:`None`.""" return lpmerge(l, r)
def TaskConsumer(self, *args, **kwargs): """Returns consumer for a single task queue.""" default_queue_name, default_queue = self.get_default_queue() defaults = dict({"queue": default_queue_name}, **default_queue) defaults["routing_key"] = defaults.pop("binding_key", None) return self.Consumer(*args, **lpmerge(defaults, kwargs))