def test_reconnect_on_socket_error(rabbit_config, mock_container): container = mock_container container.shared_extensions = {} container.config = rabbit_config container.max_workers = 1 container.spawn_managed_thread = spawn_managed_thread connection_revived = Mock() queue_consumer = QueueConsumer().bind(container) queue_consumer.setup() queue_consumer.on_connection_revived = connection_revived handler = MessageHandler() queue_consumer.register_provider(handler) queue_consumer.start() with patch.object(Connection, "drain_events", autospec=True) as drain_events: drain_events.side_effect = socket.error("test-error") def check_reconnected(): assert connection_revived.call_count > 1 assert_stops_raising(check_reconnected) queue_consumer.unregister_provider(handler) queue_consumer.stop()
def test_reconnect_on_socket_error(rabbit_config): container = Mock() container.config = rabbit_config container.max_workers = 1 container.spawn_managed_thread = spawn_thread connection_revived = Mock() queue_consumer = QueueConsumer() queue_consumer.on_connection_revived = connection_revived queue_consumer.bind("queue_consumer", container) handler = MessageHandler() queue_consumer.register_provider(handler) queue_consumer.start() with patch.object( Connection, 'drain_events', autospec=True) as drain_events: drain_events.side_effect = socket.error('test-error') def check_reconnected(): assert connection_revived.call_count > 1 assert_stops_raising(check_reconnected) queue_consumer.unregister_provider(handler) queue_consumer.stop()
def test_reconnect_on_socket_error(rabbit_config): container = Mock(spec=ServiceContainer) container.shared_extensions = {} container.config = rabbit_config container.max_workers = 1 container.spawn_managed_thread = spawn_thread connection_revived = Mock() queue_consumer = QueueConsumer().bind(container) queue_consumer.setup() queue_consumer.on_connection_revived = connection_revived handler = MessageHandler() queue_consumer.register_provider(handler) queue_consumer.start() with patch.object( Connection, 'drain_events', autospec=True) as drain_events: drain_events.side_effect = socket.error('test-error') def check_reconnected(): assert connection_revived.call_count > 1 assert_stops_raising(check_reconnected) queue_consumer.unregister_provider(handler) queue_consumer.stop()
def test_prefetch_count(rabbit_manager, rabbit_config): container = Mock() container.config = rabbit_config container.max_workers = 1 container.spawn_managed_thread = spawn_thread queue_consumer1 = QueueConsumer() queue_consumer1.bind("queue_consumer", container) queue_consumer2 = QueueConsumer() queue_consumer2.bind("queue_consumer", container) consumer_continue = Event() class Handler1(object): queue = ham_queue def handle_message(self, body, message): consumer_continue.wait() queue_consumer1.ack_message(message) messages = [] class Handler2(object): queue = ham_queue def handle_message(self, body, message): messages.append(body) queue_consumer2.ack_message(message) handler1 = Handler1() handler2 = Handler2() queue_consumer1.register_provider(handler1) queue_consumer2.register_provider(handler2) queue_consumer1.start() queue_consumer2.start() vhost = rabbit_config['vhost'] # the first consumer only has a prefetch_count of 1 and will only # consume 1 message and wait in handler1() rabbit_manager.publish(vhost, 'spam', '', 'ham') # the next message will go to handler2() no matter of any prefetch_count rabbit_manager.publish(vhost, 'spam', '', 'eggs') # the third message is only going to handler2 because the first consumer # has a prefetch_count of 1 and thus is unable to deal with another message # until having ACKed the first one rabbit_manager.publish(vhost, 'spam', '', 'bacon') with eventlet.Timeout(TIMEOUT): while len(messages) < 2: eventlet.sleep() # allow the waiting consumer to ack its message consumer_continue.send(None) assert messages == ['eggs', 'bacon'] queue_consumer1.unregister_provider(handler1) queue_consumer2.unregister_provider(handler2) queue_consumer1.kill() queue_consumer2.kill()