コード例 #1
0
    def connect(self, forever=False):
        name = self.name
        while True:
            try:
                connection = SelectConnection(self.parameters,
                                              self.on_connected)
                log.debug('%s connected', name)
            except Exception:
                if not forever:
                    raise
                log.warning('%s cannot connect', name, exc_info=True)
                time.sleep(10)
                continue

            try:
                connection.ioloop.start()
            finally:
                try:
                    connection.close()
                    connection.ioloop.start()  # allow connection to close
                except Exception:
                    pass

            if not forever:
                break
コード例 #2
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_handling(self):
        envelope = create_envelope()
        handler = Handler(envelope)
        self.assertEqual(handler.envelope, envelope)
        handler.initialize(key='value', key2='value2')
        handler.pre_handle()
        self.assertRaises(NotImplementedError, handler.handle)
        handler.post_handle()

        envelope = create_envelope()
        consumer = Consumer('localhost', 'test')
        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        consumer.connection = mock_connection
        consumer.channel = mock_channel
        handler = MessageHandler(consumer, envelope)
        self.assertEqual(handler.envelope, envelope)
        self.assertEqual(handler.consumer, consumer)
        self.assertEqual(handler.channel, mock_channel)
        handler.initialize(key='value', key2='value2')
        handler.pre_handle()
        self.assertRaises(NotImplementedError, handler.handle)
        handler.post_handle()
        msg = 'some message'
        with self.assertRaises(AbortHandling) as cm:
            handler.abort(reason=msg)
            self.assertEqual(cm.exception.reason, msg)
        with self.assertRaises(SkipHandling) as cm:
            handler.skip(reason=msg)
            self.assertEqual(cm.exception.reason, msg)
        with self.assertRaises(HandlingError) as cm:
            handler.error(error_msg=msg)
            self.assertEqual(cm.exception.error_msg, msg)
コード例 #3
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
 def test_retry_policy(self):
     envelope = create_envelope()
     consumer = create_consumer()
     mock_connection = SelectConnection()
     mock_channel = Channel(mock_connection, 10, None)
     consumer.connection = mock_connection
     consumer.channel = mock_channel
     retry_policy = RetryPolicy()
     self.assertRaises(NotImplementedError,
                       retry_policy.retry,
                       envelope=envelope)
コード例 #4
0
ファイル: queue_manager.py プロジェクト: petypi/api_is
 def __init__(self, queue, request):
     self.queue = queue
     self.response = None
     self.channel = None
     self.request = request
     self.corrId = str(uuid.uuid4())
     self.callBackQueue = None
     self.connection = None
     parameters = pika.ConnectionParameters(host='127.0.0.1')
     self.connection = SelectConnection(parameters,
                                        self.on_response_connected)
     self.connection.ioloop.start()
コード例 #5
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
 def test_fixed_delay_limited_retries_policy(self):
     consumer = create_consumer()
     mock_connection = SelectConnection()
     mock_channel = Channel(mock_connection, 10, None)
     consumer.connection = mock_connection
     consumer.channel = mock_channel
     retry_policy = FixedDelayLimitedRetriesPolicy(consumer,
                                                   delay=10,
                                                   retries_limit=7,
                                                   retry_queue_suffix='s')
     self.assertEqual(isinstance(retry_policy, LimitedRetriesPolicy), True)
     self.assertEqual(retry_policy.retry_delays, tuple([10] * 7))
     self.assertEqual(retry_policy.retry_queue_suffix, 's')
コード例 #6
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
 def test_fixed_delay_unlimited_retries_policy(self):
     consumer = create_consumer()
     mock_connection = SelectConnection()
     mock_channel = Channel(mock_connection, 10, None)
     consumer.connection = mock_connection
     consumer.channel = mock_channel
     retry_policy = FixedDelayUnlimitedRetriesPolicy(consumer,
                                                     10,
                                                     retry_queue_suffix='h')
     self.assertEqual(isinstance(retry_policy, UnlimitedRetriesPolicy),
                      True)
     self.assertEqual(retry_policy.initial_delay, 10)
     self.assertEqual(retry_policy.max_delay, 10)
     self.assertEqual(retry_policy.delay_incremented_by, 0)
     self.assertEqual(retry_policy.retry_queue_suffix, 'h')
コード例 #7
0
ファイル: newsfeed_opinion.py プロジェクト: lordke/RssFeedMQ
 def post_init(self):
     try:
         LOGGER.info('Opening a connection')
         self.connection = SelectConnection(
             parameters=settings.pika_parameters,
             on_open_callback=self.on_connection_open)
         try:
             LOGGER.info('Starting ioloop')
             self.connection.ioloop.start()
         except KeyboardInterrupt:
             # Gracefully close the connection
             self.connection.close()
             # Loop until we're fully closed, will stop on its own
             self.connection.ioloop.start()
     except:
         (etype, eobj, etb) = sys.exc_info()
         print traceback.format_exception(etype, eobj, etb)
コード例 #8
0
    def connect(self):
        if self.connecting:
            return
        self.connecting = True
        credentials = pika.PlainCredentials('guest', 'guest')
        params = pika.ConnectionParameters(host="hackinista.com",
                                           port=5672,
                                           virtual_host="/",
                                           credentials=credentials)

        host = (len(sys.argv) > 1) and sys.argv[1] or '127.0.0.1'

        try:
            self.connection = SelectConnection(params, self.on_connected)
        except:
            # self.L.critical("Error connecting to rabbitmq on host =
            # "+self.host);
            sys.exit(-1)
コード例 #9
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_consumer_restart(self):
        consumer = create_consumer()

        consumer.connection = SelectConnection()
        consumer.connection.ioloop.stop = MagicMock()
        consumer.connection.ioloop.start = MagicMock()

        # Mock add_timeout
        consumer.connection.add_timeout = MagicMock()

        def add_timeout_side_effect(delay, callback):
            self.assertEqual(delay, 0)
            self.assertEqual(callback, consumer._stop_consuming)

        consumer.connection.add_timeout.side_effect = add_timeout_side_effect

        consumer.restart()
        consumer.connection.add_timeout.assert_called_once()
コード例 #10
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_consumer_reconnect(self):
        consumer = create_consumer()

        consumer.connection = SelectConnection()
        consumer._connect = MagicMock()

        def connect_side_effect():
            return consumer.connection

        consumer._connect.side_effect = connect_side_effect

        consumer.connection.ioloop.stop = MagicMock()
        consumer.connection.ioloop.start = MagicMock()

        consumer._reconnect()
        consumer._connect.assert_called_once()
        consumer.connection.ioloop.stop.assert_called_once()
        consumer.connection.ioloop.start.assert_called_once()
コード例 #11
0
 def start(self):
     # parameters require for the AMQP connection: user name and password...
     credentials = PlainCredentials(
         RabbitMQConfiguration().getRabbitMQProperty(
             "gameLogicServerUserName"),
         RabbitMQConfiguration().getRabbitMQProperty(
             "gameLogicServerUserName"))
     parameters = pika.ConnectionParameters(
         host=RabbitMQConfiguration().getRabbitMQProperty(
             "gameLogicServerBrokerHost"),
         virtual_host=self.state.vhost,
         credentials=credentials)
     # instantiate a connection
     connection = SelectConnection(parameters=parameters,
                                   on_open_callback=self.on_connected)
     # required behavior on close
     connection.add_on_close_callback(self.on_close)
     # start the connection
     connection.ioloop.start()
コード例 #12
0
ファイル: newsfeed_bee.py プロジェクト: lordke/RssFeedMQ
 def post_init(self):
     # 初始化分发任务类dispatcher
     # 通过异步的方式 打开rabbitMQ的连接,并新建channel,声明exchange,声明queue,绑定exchange和queue,然后运行run方法,之前运行ioloop
     self.dispatcher = Dispatcher(self.options)
     try:
         LOGGER.info('Opening a pika connection')
         self.connection = SelectConnection(
             parameters=settings.pika_parameters,
             on_open_callback=self.on_connection_open,
             on_open_error_callback=self.on_connection_open_error)
         try:
             LOGGER.info('Starting ioloop')
             self.connection.ioloop.start()
         except KeyboardInterrupt:
             # Gracefully close the connection
             self.connection.close()
             # Loop until we're fully closed, will stop on its own
             self.connection.ioloop.start()
     except:
         (etype, eobj, etb) = sys.exc_info()
         print traceback.format_exception(etype, eobj, etb)
コード例 #13
0
        def run(self):
            """ Run thread"""
            threading.Thread.run(self)
            try:
                # get amqp connection params
                #self.mqConnection = self.serviceContext.get_object("mqConnection")
                parameters = self.server.serviceContext.get_object(
                    "amqpServer_connection_pars")

                # Step #1: Connect to RabbitMQ
                self.server.mqConnection = SelectConnection(
                    parameters, self.on_connected)
                self.server.mqConnection.ioloop.start()
                #channel.start_consuming()
            except Exception as ex:
                # Gracefully close the connection
                if self.server.mqConnection != None:
                    self.server.mqConnection.close()
                # Loop until we're fully closed, will stop on its own
                #connection.ioloop.start()
                self.server.logger.error(traceback.format_exc())
コード例 #14
0
ファイル: newsfeed_maggot.py プロジェクト: lordke/RssFeedMQ
 def post_init(self):
     #初始化 新建RabbitMQ 队列和exchange并绑定(2个)
     LOGGER.info('Initializing a FeedProcessor')
     #self.feedprocessor.post_init()
     LOGGER.info('Initializing a FeedProcessor completed')
     try:
         LOGGER.info('Opening a connection')
         #self.dispatcher = Dispatcher(self.options)
         self.connection = SelectConnection(
             parameters=settings.pika_parameters,
             on_open_callback=self.on_connection_open)
         try:
             LOGGER.info('Starting ioloop')
             self.connection.ioloop.start()
         except KeyboardInterrupt:
             # Gracefully close the connection
             self.connection.close()
             # Loop until we're fully closed, will stop on its own
             self.connection.ioloop.start()
     except:
         (etype, eobj, etb) = sys.exc_info()
         print traceback.format_exception(etype, eobj, etb)
コード例 #15
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_consumer_auto_reconnect_error(self):
        consumer = create_consumer()

        consumer.connection = SelectConnection()
        consumer.connection.ioloop.stop = MagicMock()
        consumer.connection.ioloop.start = MagicMock()

        # Mock add_timeout
        consumer.connection.add_timeout = MagicMock()

        def add_timeout_side_effect(delay, callback):
            self.assertEqual(delay, consumer.auto_reconnect_delay)
            self.assertEqual(callback, consumer._reconnect)

        consumer.connection.add_timeout.side_effect = add_timeout_side_effect

        # Simulate reconnection failute
        consumer._on_open_connection_error(consumer.connection, Exception())
        consumer.connection.add_timeout.assert_called_once()

        # Test shutdown on reconnection failure
        consumer.auto_reconnect = False
        consumer._on_open_connection_error(consumer.connection, Exception())
        consumer.connection.ioloop.stop.assert_called_once()
コード例 #16
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_rule_router(self):
        consumer = create_consumer()
        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        consumer.connection = mock_connection
        consumer.channel = mock_channel

        with self.assertRaises(AssertionError):
            RuleRouter(consumer, 'None rule object')

        router = RuleRouter(consumer)
        self.assertEqual(router.consumer, consumer)
        envelope = create_envelope()
        self.assertIsNone(router.find_handler(envelope))
        default_rule = Rule(AnyMatches(), MessageHandler, None)
        router.set_default_rule(default_rule)
        self.assertIsNotNone(router.find_handler(envelope))
        handler = router.find_handler(envelope)
        self.assertEqual(isinstance(handler, Handler), True)
        router.set_default_rule(None)
        self.assertIsNone(router.find_handler(envelope))
        router = RuleRouter(consumer, default_rule)
        self.assertIsNotNone(router.find_handler(envelope))

        class CustomHandler(MessageHandler):
            def initialize(self, arg1, arg2, **kwargs):
                super(CustomHandler, self).initialize(**kwargs)
                self.arg1 = arg1
                self.arg2 = arg2

        message_type_matcher = MessageTypeMatches(r'message_a')
        rule = Rule(message_type_matcher, CustomHandler, {
            'arg1': 1,
            'arg2': 2
        })
        router.add_rule(rule)
        envelope.properties.type = 'message_a'
        handler = router.find_handler(envelope)
        self.assertEqual(isinstance(handler, CustomHandler), True)
        self.assertEqual(handler.arg1, 1)
        self.assertEqual(handler.arg2, 2)
        self.assertEqual(handler.consumer, consumer)
        router.set_default_rule(default_rule)
        handler = router.find_handler(envelope)
        self.assertEqual(isinstance(handler, CustomHandler), True)
        envelope = create_envelope()
        handler = router.find_handler(envelope)
        self.assertEqual(isinstance(handler, Handler), True)

        # test subrouting
        default_subrouter_rule = Rule(message_type_matcher, CustomHandler, {
            'arg1': 1,
            'arg2': 2
        })
        subrouter = RuleRouter(consumer, default_subrouter_rule)
        # default rule for main router is the subrouter
        main_default_rule = Rule(AnyMatches(), subrouter, None)
        main_router = RuleRouter(consumer, main_default_rule)
        handler = main_router.find_handler(envelope)
        self.assertIsNone(handler)
        envelope.properties.type = 'message_a'
        handler = main_router.find_handler(envelope)
        self.assertEqual(isinstance(handler, CustomHandler), True)
        self.assertEqual(handler.arg1, 1)
        self.assertEqual(handler.arg2, 2)
        self.assertEqual(handler.consumer, consumer)
コード例 #17
0
 def connect(self):
     SelectPoller.TIMEOUT = float(self.poller_delay)
     return SelectConnection(self.parameters, self.on_connection_open,
                             stop_ioloop_on_close=False)
コード例 #18
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_limited_retries_policy(self):
        envelope = create_envelope()
        consumer = create_consumer()
        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        consumer.connection = mock_connection
        consumer.channel = mock_channel

        retry_policy = LimitedRetriesPolicy(consumer=consumer,
                                            retry_delays=(1, 5, 10, 50,
                                                          5 * 60),
                                            retry_queue_suffix='r')
        mock_channel.queue_declare = MagicMock()
        mock_channel.basic_publish = MagicMock()
        mock_channel.basic_ack = MagicMock()
        mock_channel.basic_reject = MagicMock()

        retry_policy.retry(envelope)
        mock_channel.queue_declare.assert_called_with(
            callback=None,
            queue='{}.{}.{}'.format(consumer.queue_name,
                                    retry_policy.retry_queue_suffix, 1000),
            durable=consumer.durable,
            nowait=True,
            arguments={
                'x-dead-letter-exchange': '',
                'x-dead-letter-routing-key': consumer.queue_name,
                'x-message-ttl': 1000,
                'x-expires': retry_policy.min_retry_queue_ttl
            })

        mock_channel.basic_publish.assert_called_with(
            exchange='',
            routing_key='{}.{}.{}'.format(consumer.queue_name,
                                          retry_policy.retry_queue_suffix,
                                          1000),
            properties=envelope.properties,
            body=envelope.payload)
        mock_channel.basic_ack.assert_called_with(envelope.delivery_tag)

        self.assertEqual(
            envelope.get_header('x-original-delivery-info'), {
                'consumer_tag': envelope.consumer_tag,
                'delivery_tag': envelope.delivery_tag,
                'redelivered': envelope.redelivered,
                'exchange': envelope.exchange,
                'routing_key': envelope.routing_key
            })

        envelope.set_header('x-death', [{
            'queue': consumer.queue_name,
            'count': 1
        }, {
            'queue':
            '{}.{}.{}'.format(consumer.queue_name,
                              retry_policy.retry_queue_suffix, 10000),
            'count':
            3
        }, {
            'queue': 'some-queue',
            'count': 1
        }])

        retry_policy.retry(envelope)
        delay = 5 * 60
        retry_queue_name = '{}.{}.{}'.format(consumer.queue_name,
                                             retry_policy.retry_queue_suffix,
                                             delay * 1000)
        mock_channel.queue_declare.assert_called_with(
            callback=None,
            queue=retry_queue_name,
            durable=consumer.durable,
            nowait=True,
            arguments={
                'x-dead-letter-exchange': '',
                'x-dead-letter-routing-key': consumer.queue_name,
                'x-message-ttl': delay * 1000,
                'x-expires': delay * 2 * 1000
            })

        mock_channel.basic_publish.assert_called_with(
            exchange='',
            routing_key=retry_queue_name,
            properties=envelope.properties,
            body=envelope.payload)
        mock_channel.basic_ack.assert_called_with(envelope.delivery_tag)
        self.assertEqual(
            envelope.get_header('x-original-delivery-info'), {
                'consumer_tag': envelope.consumer_tag,
                'delivery_tag': envelope.delivery_tag,
                'redelivered': envelope.redelivered,
                'exchange': envelope.exchange,
                'routing_key': envelope.routing_key
            })

        envelope.set_header('x-death', [{
            'queue': consumer.queue_name,
            'count': 1
        }, {
            'queue':
            '{}.{}.{}'.format(consumer.queue_name,
                              retry_policy.retry_queue_suffix, 10000),
            'count':
            4
        }, {
            'queue': 'some-queue',
            'count': 1
        }])

        retry_policy.retry(envelope)
        mock_channel.basic_reject.assert_called_with(envelope.delivery_tag,
                                                     requeue=False)

        envelope.set_header('x-death', [{
            'queue': consumer.queue_name,
            'count': 1
        }, {
            'queue':
            '{}.{}.{}'.format(consumer.queue_name,
                              retry_policy.retry_queue_suffix, 10000),
            'count':
            46
        }, {
            'queue': 'some-queue',
            'count': 1
        }])

        retry_policy.retry(envelope)
        mock_channel.basic_reject.assert_called_with(envelope.delivery_tag,
                                                     requeue=False)
コード例 #19
0
ファイル: demo_receive.py プロジェクト: pierremarc/pika
def on_queue_declared(frame):
    print "demo_receive: Queue Declared"
    channel.basic_consume(handle_delivery, queue='test')


def handle_delivery(channel, method_frame, header_frame, body):
    print "Basic.Deliver %s delivery-tag %i: %s" %\
          (header_frame.content_type,
           method_frame.delivery_tag,
           body)
    channel.basic_ack(delivery_tag=method_frame.delivery_tag)


if __name__ == '__main__':

    # Connect to RabbitMQ
    host = (len(sys.argv) > 1) and sys.argv[1] or '127.0.0.1'
    connection = SelectConnection(ConnectionParameters(host), on_connected)
    # Loop until CTRL-C
    try:
        # Start our blocking loop
        connection.ioloop.start()

    except KeyboardInterrupt:

        # Close the connection
        connection.close()

        # Loop until the conneciton is closed
        connection.ioloop.start()
コード例 #20
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_consumer_start_up_process(self):
        consumer = create_consumer()
        envelope = create_envelope()

        consumer.connection = SelectConnection()
        mock_channel = Channel(consumer.connection, 10, None)

        # Mock exchange_declare
        mock_channel.exchange_declare = MagicMock()

        def on_exchange_declareok(callback, exchange, exchange_type, durable,
                                  auto_delete, internal, arguments):
            self.assertEqual(exchange, 'exchange1')
            self.assertEqual(exchange_type, 'topic')
            self.assertEqual(durable, False)
            self.assertEqual(auto_delete, False)
            self.assertEqual(internal, False)
            self.assertEqual(arguments, None)
            callback(None)

        mock_channel.exchange_declare.side_effect = on_exchange_declareok

        # Mock queue_declare
        mock_channel.queue_declare = MagicMock()

        def on_consumer_queue_declareok(callback, queue, durable, exclusive,
                                        arguments):
            self.assertEqual(queue, consumer.queue_name)
            self.assertEqual(durable, consumer.durable)
            self.assertEqual(exclusive, consumer.exclusive)
            self.assertEqual(arguments,
                             {'x-dead-letter-exchange': consumer.dlx_name})
            callback(None)

        mock_channel.queue_declare.side_effect = on_consumer_queue_declareok

        # Mock queue_bind
        mock_channel.queue_bind = MagicMock()

        def on_bindok(callback, queue, exchange, routing_key):
            self.assertEqual(queue, consumer.queue_name)
            self.assertEqual(routing_key, 'key1')
            callback(None)

        mock_channel.queue_bind.side_effect = on_bindok

        mock_channel.add_on_close_callback = MagicMock()

        # Mock basic_consume
        mock_channel.basic_consume = MagicMock()

        def on_message(callback, queue):
            self.assertEqual(queue, consumer.queue_name)
            mock_channel.basic_reject = MagicMock()
            callback(mock_channel, envelope.delivery_info, envelope.properties,
                     envelope.payload)

        mock_channel.basic_consume.side_effect = on_message

        # connection.channel method used to open a new channel
        # mock method is used to return the created mock_channel
        consumer.connection.channel = MagicMock()

        def on_channel_open(on_open_callback):
            on_open_callback(mock_channel)

        consumer.connection.channel.side_effect = on_channel_open

        consumer.connection.ioloop.start = MagicMock()
        consumer.connection.ioloop.stop = MagicMock()
        consumer.add_exchange_bind(exchange_name='exchange1',
                                   routing_key='key1',
                                   declare_exchange=True,
                                   declare_kwargs={'type': 'topic'})
        consumer.add_exchange_bind(exchange_name='exchange1',
                                   routing_key='key1')

        # Initiate open connection manually
        consumer._on_connection_open(None)

        mock_channel.add_on_close_callback.assert_called_once()
        mock_channel.queue_declare.assert_called_once()
        mock_channel.basic_reject.assert_called_once()
        mock_channel.queue_declare.assert_called_once()
        queue_bind_count = len(mock_channel.queue_bind.call_args_list)
        self.assertEqual(queue_bind_count, 2)
        mock_channel.basic_consume.assert_called_once()

        # Stopping consumer

        # Mock add_timeout
        consumer.connection.add_timeout = MagicMock()

        def add_timeout_side_effect(delay, callback):
            callback()

        consumer.connection.add_timeout.side_effect = add_timeout_side_effect

        # Mock basic_cancel
        consumer.channel.basic_cancel = MagicMock()

        def on_cancelok(callback, consumer_tag):
            callback(None)

        consumer.channel.basic_cancel.side_effect = on_cancelok

        # Mock channel close
        consumer.channel.close = MagicMock()

        def channel_close_side_effect():
            consumer._on_channel_closed(consumer.channel, '', '')

        consumer.channel.close.side_effect = channel_close_side_effect

        # Mock connection close
        consumer.connection.close = MagicMock()

        def on_connection_closed():
            consumer._on_connection_closed(consumer.connection, '', '')

        consumer.connection.close.side_effect = on_connection_closed

        # Simulate stop
        consumer.stop()

        consumer.connection.add_timeout.assert_called_once()
        consumer.connection.close.assert_called_once()
        self.assertIsNone(consumer.channel)
        consumer.connection.ioloop.stop.assert_called_once()
コード例 #21
0
    ssl_options = {}

    # Uncomment this to test client certs, change to your cert paths
    # Uses certs as generated from http://www.rabbitmq.com/ssl.html
    ssl_options = {
        "ca_certs": "/etc/rabbitmq/new/server/chain.pem",
        "certfile": "/etc/rabbitmq/new/client/cert.pem",
        "keyfile": "/etc/rabbitmq/new/client/key.pem",
        "cert_reqs": CERT_REQUIRED
    }

    # Connect to RabbitMQ
    host = (len(sys.argv) > 1) and sys.argv[1] or '127.0.0.1'
    parameters = ConnectionParameters(host,
                                      5671,
                                      ssl=True,
                                      ssl_options=ssl_options)
    connection = SelectConnection(parameters, on_connected)
    # Loop until CTRL-C
    try:
        # Start our blocking loop
        connection.ioloop.start()

    except KeyboardInterrupt:

        # Close the connection
        connection.close()

        # Loop until the conneciton is closed
        connection.ioloop.start()
コード例 #22
0
ファイル: test_rabbitleap.py プロジェクト: asahaf/rabbitleap
    def test_consumer(self):
        amqp_url = r'amqp://*****:*****@localhost:5672/%2f'
        queue_name = 'queue1'
        durable = True
        exclusive = True
        dlx_name = 'dead_exchange'
        auto_reconnect = True
        auto_reconnect_delay = 10

        consumer = Consumer(amqp_url=amqp_url,
                            queue_name=queue_name,
                            durable=durable,
                            exclusive=exclusive,
                            dlx_name=dlx_name,
                            auto_reconnect=auto_reconnect,
                            auto_reconnect_delay=auto_reconnect_delay)

        self.assertEqual(consumer.amqp_url, amqp_url)
        self.assertEqual(consumer.queue_name, queue_name)
        self.assertEqual(consumer.durable, durable)
        self.assertEqual(consumer.exclusive, exclusive)
        self.assertEqual(consumer.dlx_name, dlx_name)
        self.assertEqual(consumer.auto_reconnect, auto_reconnect)
        self.assertEqual(consumer.auto_reconnect_delay, auto_reconnect_delay)

        # Test abort
        with self.assertRaises(AbortHandling) as cm:
            consumer.abort('some reason')
            self.assertEqual(cm.exception.reason, 'some reason')

        # Test skip
        with self.assertRaises(SkipHandling) as cm:
            consumer.skip('some reason')
            self.assertEqual(cm.exception.reason, 'some reason')

        # Test error
        with self.assertRaises(HandlingError) as cm:
            consumer.error('some error')
            self.assertEqual(cm.exception.error_msg, 'some error')

        # Test bind to exchange
        exchange_name = 'exchange1'
        routing_key = 'some_routing_key'
        declare_exchange = True
        declare_kwargs = {'type': 'topic'}

        consumer.add_exchange_bind(exchange_name=exchange_name,
                                   routing_key=routing_key,
                                   declare_exchange=declare_exchange,
                                   declare_kwargs=declare_kwargs)

        self.assertEqual(
            consumer._exchange_binds[0],
            ((exchange_name, routing_key, declare_exchange, declare_kwargs)))

        with self.assertRaises(AssertionError) as cm:
            consumer.add_exchange_bind(exchange_name=exchange_name,
                                       routing_key=routing_key,
                                       declare_exchange=declare_exchange,
                                       declare_kwargs=None)

        with self.assertRaises(AssertionError) as cm:
            consumer.add_exchange_bind(exchange_name=exchange_name,
                                       routing_key=routing_key,
                                       declare_exchange=declare_exchange,
                                       declare_kwargs={})

        # Test add handler

        consumer.add_handler('some_pattern', Handler, None)
        self.assertEqual(len(consumer.rules), 2)
        self.assertEqual(
            isinstance(consumer.rules[-2].matcher, MessageTypeMatches), True)
        self.assertEqual(consumer.rules[-2].matcher.message_type_pattern,
                         'some_pattern')

        consumer.add_handler(AnyMatches(), Handler, None)
        self.assertEqual(len(consumer.rules), 3)
        self.assertEqual(isinstance(consumer.rules[-2].matcher, AnyMatches),
                         True)

        # Test set default  handler

        consumer.set_default_handler(Handler)
        self.assertEqual(isinstance(consumer.rules[-1].matcher, AnyMatches),
                         True)

        consumer.set_default_handler(None)
        self.assertEqual(isinstance(consumer.rules[-1].matcher, NoneMatches),
                         True)

        # Test set/unset policy
        policy = FixedDelayLimitedRetriesPolicy(consumer=consumer,
                                                delay=5,
                                                retries_limit=15)
        consumer.set_retry_policy(policy)
        self.assertEqual(consumer._retry_policy, policy)

        self.assertRaises(AssertionError, consumer.set_retry_policy,
                          'non policy object')

        consumer.unset_retry_policy()
        self.assertIsNone(consumer._retry_policy)

        # Test handling message
        envelope = create_envelope()
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel

        # Test no handler, should reject message
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        consumer.channel.basic_reject.assert_called_with(envelope.delivery_tag,
                                                         requeue=False)

        # Test positive message handling
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class SuccessHandler(Handler):
            def __init__(self, envelope, **kwargs):
                super(SuccessHandler, self).__init__(envelope, **kwargs)
                self.pre_handle = pre_handle_mock
                self.handle = handle_mock
                self.post_handle = post_handle_mock

        consumer.add_handler(AnyMatches(), SuccessHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        pre_handle_mock.assert_called_once()
        handle_mock.assert_called_once()
        post_handle_mock.assert_called_once()
        consumer.channel.basic_ack.assert_called_with(envelope.delivery_tag)

        # Test skip message handling
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class SkipHandler(MessageHandler):
            def __init__(self, consumer, envelope, **kwargs):
                super(SkipHandler, self).__init__(consumer, envelope, **kwargs)
                self.handle = handle_mock
                self.post_handle = post_handle_mock

            def pre_handle(self):
                self.skip(reason='some reason')

        consumer.add_handler(AnyMatches(), SkipHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_ack.assert_called_with(envelope.delivery_tag)

        # Test abort message handling
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class AbortHandler(MessageHandler):
            def __init__(self, consumer, envelope, **kwargs):
                super(AbortHandler, self).__init__(consumer, envelope,
                                                   **kwargs)
                self.handle = handle_mock
                self.post_handle = post_handle_mock

            def pre_handle(self):
                self.abort(reason='some reason')

        consumer.add_handler(AnyMatches(), AbortHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_called_with(envelope.delivery_tag,
                                                         requeue=False)

        consumer.channel.basic_ack.assert_not_called()

        # Test error message handling
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class ErrorHandler(MessageHandler):
            def __init__(self, consumer, envelope, **kwargs):
                super(ErrorHandler, self).__init__(consumer, envelope,
                                                   **kwargs)
                self.handle = handle_mock
                self.post_handle = post_handle_mock

            def pre_handle(self):
                self.error(error_msg='some reason')

        consumer.add_handler(AnyMatches(), ErrorHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_called_with(envelope.delivery_tag,
                                                         requeue=False)

        consumer.channel.basic_ack.assert_not_called()

        # Test error message handling with retry policy
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        retry_policy = RetryPolicy()
        retry_policy.retry = MagicMock()
        consumer.set_retry_policy(retry_policy)
        consumer.add_handler(AnyMatches(), ErrorHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_not_called()
        consumer.channel.basic_ack.assert_not_called()
        retry_policy.retry.assert_called_once()

        # Test error message handling; general exception
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class ExceHandler(MessageHandler):
            def __init__(self, consumer, envelope, **kwargs):
                super(ExceHandler, self).__init__(consumer, envelope, **kwargs)
                self.handle = handle_mock
                self.post_handle = post_handle_mock

            def pre_handle(self):
                raise Exception()

        consumer.add_handler(AnyMatches(), ExceHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_called_with(envelope.delivery_tag,
                                                         requeue=False)

        consumer.channel.basic_ack.assert_not_called()

        # Test error message handling; general exception with retry policy
        # Create fresh consumer
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        retry_policy = RetryPolicy()
        retry_policy.retry = MagicMock()
        consumer.set_retry_policy(retry_policy)
        consumer.add_handler(AnyMatches(), ExceHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_not_called()
        consumer.channel.basic_ack.assert_not_called()
        retry_policy.retry.assert_called_once()

        # Should handle AMQPConnectionError
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class AMQPConnectionErrorHandler(MessageHandler):
            def __init__(self, consumer, envelope, **kwargs):
                super(AMQPConnectionErrorHandler,
                      self).__init__(consumer, envelope, **kwargs)
                self.handle = handle_mock
                self.post_handle = post_handle_mock

            def pre_handle(self):
                raise AMQPConnectionError()

        consumer.add_handler(AnyMatches(), AMQPConnectionErrorHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_not_called()
        consumer.channel.basic_ack.assert_not_called()

        # Should handle AMQPChannelError
        consumer = create_consumer()

        mock_connection = SelectConnection()
        mock_channel = Channel(mock_connection, 10, None)
        mock_channel.basic_nack = MagicMock()
        mock_channel.basic_reject = MagicMock()
        consumer.channel = mock_channel
        consumer.channel.basic_ack = MagicMock()
        pre_handle_mock = MagicMock()
        handle_mock = MagicMock()
        post_handle_mock = MagicMock()

        class AMQPChannelErrorHandler(MessageHandler):
            def __init__(self, consumer, envelope, **kwargs):
                super(AMQPChannelErrorHandler,
                      self).__init__(consumer, envelope, **kwargs)
                self.handle = handle_mock
                self.post_handle = post_handle_mock

            def pre_handle(self):
                raise AMQPChannelError()

        consumer.add_handler(AnyMatches(), AMQPChannelErrorHandler)
        consumer._on_message(mock_channel, envelope.delivery_info,
                             envelope.properties, envelope.payload)

        handle_mock.assert_not_called()
        post_handle_mock.assert_not_called()
        consumer.channel.basic_reject.assert_not_called()
        consumer.channel.basic_ack.assert_not_called()
コード例 #23
0
ファイル: __init__.py プロジェクト: bboerner/zato
 def _start(self):
     self.conn = SelectConnection(self.conn_params, self._on_connected)
     self.conn.ioloop.start()
コード例 #24
0
ファイル: amqp.py プロジェクト: engalex/synapse-agent
 def connect(self):
     SelectPoller.TIMEOUT = .1
     self.connection = SelectConnection(self.parameters, self.on_connected)
     self.connection.ioloop.start()