def test_get_producer(self, rabbit_config, confirms): amqp_uri = rabbit_config['AMQP_URI'] producer_ids = [] with get_producer(amqp_uri, confirms) as producer: producer_ids.append(id(producer)) transport_options = producer.connection.transport_options assert isinstance(producer, Producer) assert transport_options['confirm_publish'] is confirms with get_producer(amqp_uri, confirms) as producer: producer_ids.append(id(producer)) assert len(set(producer_ids)) == 1
def publish(msg): with get_producer(amqp_uri) as producer: producer.publish( msg, serializer="json", routing_key=queue.name )
def test_confirms_disabled(self, rabbit_config): amqp_uri = rabbit_config['AMQP_URI'] with get_producer(amqp_uri, False) as producer: producer.publish( "msg", exchange="missing", routing_key="key" )
def test_confirms_enabled(self, rabbit_config): amqp_uri = rabbit_config['AMQP_URI'] with pytest.raises(NotFound): with get_producer(amqp_uri) as producer: producer.publish( "msg", exchange="missing", routing_key="key" )
def test_pool_gives_different_producers(self, rabbit_config): amqp_uri = rabbit_config['AMQP_URI'] producer_ids = [] # get a producer with get_producer(amqp_uri, True) as confirmed_producer: producer_ids.append(id(confirmed_producer)) assert len(set(producer_ids)) == 1 # get a producer with the same parameters with get_producer(amqp_uri, True) as confirmed_producer: producer_ids.append(id(confirmed_producer)) assert len(set(producer_ids)) == 1 # same producer returned # get a producer with different parameters with get_producer(amqp_uri, False) as unconfirmed_producer: producer_ids.append(id(unconfirmed_producer)) assert len(set(producer_ids)) == 2 # different producer returned
def republish(self, backoff_exc, message, target_queue): expiration = backoff_exc.next(message, self.exchange.name) queue = self.make_queue(expiration) # republish to appropriate backoff queue amqp_uri = self.container.config[AMQP_URI_CONFIG_KEY] with get_producer(amqp_uri) as producer: properties = message.properties.copy() headers = properties.pop('application_headers') headers['backoff'] = expiration expiration_seconds = float(expiration) # force redeclaration; the publisher will skip declaration if # the entity has previously been declared by the same connection # (see https://github.com/celery/kombu/pull/884) maybe_declare(queue, producer.channel, retry=True, **DEFAULT_RETRY_POLICY) @retry(for_exceptions=UndeliverableMessage) def publish(): try: producer.publish(message.body, headers=headers, exchange=self.exchange, routing_key=target_queue, expiration=expiration_seconds, mandatory=True, retry=True, retry_policy=DEFAULT_RETRY_POLICY, declare=[queue.exchange, queue], **properties) except ChannelError as exc: if "NO_ROUTE" in str(exc): raise UndeliverableMessage() raise try: returned_messages = producer.channel.returned_messages returned = returned_messages.get_nowait() except PyQueue.Empty: pass else: raise UndeliverableMessage(returned) publish()
def producer(self, get_producer): producer = get_producer().__enter__.return_value # make sure we don't raise UndeliverableMessage if mandatory is True producer.channel.returned_messages.get_nowait.side_effect = queue.Empty return producer