Exemple #1
0
    def setup(self):
        _log.debug('starting %s', self)

        # handler_type determines queue name
        service_name = self.container.service_name
        if self.handler_type is SERVICE_POOL:
            queue_name = "evt-{}-{}--{}.{}".format(self.source_service,
                                                   self.event_type,
                                                   service_name,
                                                   self.method_name)
        elif self.handler_type is SINGLETON:
            queue_name = "evt-{}-{}".format(self.source_service,
                                            self.event_type)
        elif self.handler_type is BROADCAST:
            queue_name = "evt-{}-{}--{}.{}-{}".format(self.source_service,
                                                      self.event_type,
                                                      service_name,
                                                      self.method_name,
                                                      uuid.uuid4().hex)

        exchange = get_event_exchange(self.source_service)

        # auto-delete queues if events are not reliably delivered
        auto_delete = not self.reliable_delivery
        self.queue = Queue(queue_name,
                           exchange=exchange,
                           routing_key=self.event_type,
                           durable=True,
                           auto_delete=auto_delete)

        super(EventHandler, self).setup()
Exemple #2
0
    def test_restricted_parameters(
        self, mock_container, producer
    ):
        """ Verify that providing routing parameters at instantiation
        time has no effect.
        """
        mock_container.config = {'AMQP_URI': 'memory://localhost'}
        mock_container.service_name = "service"

        worker_ctx = Mock()
        worker_ctx.context_data = {}

        exchange = Mock()
        routing_key = Mock()

        dispatcher = EventDispatcher(
            exchange=exchange,
            routing_key=routing_key,
        ).bind(mock_container, "dispatch")
        dispatcher.setup()

        dispatch = dispatcher.get_dependency(worker_ctx)

        event_exchange = get_event_exchange("service")
        event_type = "event-type"

        dispatch(event_type, "event-data")

        assert producer.publish.call_args[1]['exchange'] == event_exchange
        assert producer.publish.call_args[1]['routing_key'] == event_type
Exemple #3
0
    def test_restricted_parameters(self, mock_container, producer):
        """ Verify that providing routing parameters at instantiation
        time has no effect.
        """
        mock_container.config = {'AMQP_URI': 'memory://localhost'}
        mock_container.service_name = "service"

        worker_ctx = Mock()
        worker_ctx.context_data = {}

        exchange = Mock()
        routing_key = Mock()

        dispatcher = EventDispatcher(
            exchange=exchange,
            routing_key=routing_key,
        ).bind(mock_container, "dispatch")
        dispatcher.setup()

        dispatch = dispatcher.get_dependency(worker_ctx)

        event_exchange = get_event_exchange("service", config={})
        event_type = "event-type"

        dispatch(event_type, "event-data")

        assert producer.publish.call_args[1]['exchange'] == event_exchange
        assert producer.publish.call_args[1]['routing_key'] == event_type
Exemple #4
0
    def setup(self):
        _log.debug('starting %s', self)

        # handler_type determines queue name
        service_name = self.container.service_name
        if self.handler_type is SERVICE_POOL:
            queue_name = "evt-{}-{}--{}.{}".format(self.source_service,
                                                   self.event_type,
                                                   service_name,
                                                   self.method_name)
        elif self.handler_type is SINGLETON:
            queue_name = "evt-{}-{}".format(self.source_service,
                                            self.event_type)
        elif self.handler_type is BROADCAST:
            queue_name = "evt-{}-{}--{}.{}-{}".format(self.source_service,
                                                      self.event_type,
                                                      service_name,
                                                      self.method_name,
                                                      uuid.uuid4().hex)

        exchange = get_event_exchange(self.source_service)

        # auto-delete queues if events are not reliably delivered
        auto_delete = not self.reliable_delivery
        self.queue = Queue(
            queue_name, exchange=exchange, routing_key=self.event_type,
            durable=True, auto_delete=auto_delete)

        super(EventHandler, self).setup()
Exemple #5
0
    def setup(self):
        _log.debug('starting %s', self)

        # handler_type determines queue name and exclusive flag
        exclusive = False
        service_name = self.container.service_name
        if self.handler_type is SERVICE_POOL:
            queue_name = "evt-{}-{}--{}.{}".format(self.source_service,
                                                   self.event_type,
                                                   service_name,
                                                   self.method_name)
        elif self.handler_type is SINGLETON:
            queue_name = "evt-{}-{}".format(self.source_service,
                                            self.event_type)
        elif self.handler_type is BROADCAST:
            broadcast_identifier = self.broadcast_identifier
            queue_name = "evt-{}-{}--{}.{}-{}".format(self.source_service,
                                                      self.event_type,
                                                      service_name,
                                                      self.method_name,
                                                      broadcast_identifier)

        exchange = get_event_exchange(self.source_service)

        # queues for handlers without reliable delivery should be marked as
        # auto-delete so they're removed when the consumer disconnects
        auto_delete = self.reliable_delivery is False

        # queues for broadcast handlers are exclusive (meaning that only one
        # consumer may be connected) except when reliable delivery is enabled,
        # because exclusive queues are always removed when the consumer
        # disconnects, regardless of the value of auto_delete
        exclusive = self.handler_type is BROADCAST
        if self.reliable_delivery:
            exclusive = False

        if self.retry_delay:
            queue_name = '{}-delayed'.format(queue_name)
            self.queue = DelayedRetryQueue(queue_name,
                                           exchange=exchange,
                                           routing_key=self.event_type,
                                           durable=True,
                                           auto_delete=auto_delete,
                                           exclusive=exclusive,
                                           retry_delay=self.retry_delay)
        else:
            self.queue = Queue(queue_name,
                               exchange=exchange,
                               routing_key=self.event_type,
                               durable=True,
                               auto_delete=auto_delete,
                               exclusive=exclusive)

        super(EventHandler, self).setup()
Exemple #6
0
    def setup(self):
        _log.debug('starting %s', self)

        # handler_type determines queue name and exclusive flag
        exclusive = False
        service_name = self.container.service_name
        if self.handler_type is SERVICE_POOL:
            queue_name = "evt-{}-{}--{}.{}".format(self.source_service,
                                                   self.event_type,
                                                   service_name,
                                                   self.method_name)
        elif self.handler_type is SINGLETON:
            queue_name = "evt-{}-{}".format(self.source_service,
                                            self.event_type)
        elif self.handler_type is BROADCAST:
            broadcast_identifier = self.broadcast_identifier
            queue_name = "evt-{}-{}--{}.{}-{}".format(self.source_service,
                                                      self.event_type,
                                                      service_name,
                                                      self.method_name,
                                                      broadcast_identifier)

        exchange = get_event_exchange(self.source_service)

        # queues for handlers without reliable delivery should be marked as
        # auto-delete so they're removed when the consumer disconnects
        auto_delete = self.reliable_delivery is False

        # queues for broadcast handlers are exclusive (meaning that only one
        # consumer may be connected) except when reliable delivery is enabled,
        # because exclusive queues are always removed when the consumer
        # disconnects, regardless of the value of auto_delete
        exclusive = self.handler_type is BROADCAST
        if self.reliable_delivery:
            exclusive = False

        self.queue = Queue(
            queue_name, exchange=exchange, routing_key=self.event_type,
            durable=True, auto_delete=auto_delete, exclusive=exclusive)

        super(EventHandler, self).setup()
    def test_restricted_parameters(self, mock_container, producer):
        """ Verify that providing routing parameters at instantiation
        time has no effect.
        """
        config = {'AMQP_URI': 'memory://localhost'}

        exchange = Mock()
        routing_key = Mock()

        dispatch = event_dispatcher(config,
                                    exchange=exchange,
                                    routing_key=routing_key)

        service_name = "service-name"
        event_exchange = get_event_exchange(service_name, config)
        event_type = "event-type"

        dispatch(service_name, event_type, "event-data")

        assert producer.publish.call_args[1]['exchange'] == event_exchange
        assert producer.publish.call_args[1]['routing_key'] == event_type
Exemple #8
0
 def setup(self):
     self.service_name = self.container.service_name
     self.config = self.container.config
     self.exchange = get_event_exchange(self.service_name)
     super(EventDispatcher, self).setup()
Exemple #9
0
def test_auto_delete(config, expected_auto_delete):
    service_name = "example"
    exchange = get_event_exchange(service_name, config)
    assert exchange.auto_delete is expected_auto_delete
Exemple #10
0
def test_auto_declaration(config, expected_no_declare):
    service_name = "example"
    exchange = get_event_exchange(service_name, config)
    assert exchange.no_declare is expected_no_declare
Exemple #11
0
    def publish(
        self,
        event_type: str = None,
        event_data: dict = None,
        extra_headers: dict = None,
    ):
        self.publisher.publish(
            event_data,
            exchange=self.exchange,
            routing_key=event_type,
            extra_headers=extra_headers,
        )


scheduler_publisher = SchedulerPublisher(
    exchange=get_event_exchange(EXCHANGE_NAME))


class Scheduler(DependencyProvider):
    background_scheduler = BackgroundScheduler()

    def __init__(self):
        self.extra_headers = None

    def start(self):
        self.background_scheduler.start()

    def setup(self):
        scheduler_config = config["APSCHDULER"]
        self.background_scheduler.configure(gconfig=scheduler_config,
                                            prefix="")
Exemple #12
0
 def setup(self):
     self.service_name = self.container.service_name
     self.config = self.container.config
     self.exchange = get_event_exchange(self.service_name)
     super(EventDispatcher, self).setup()
Exemple #13
0
 def _create_exchange(self) -> None:
     with get_connection(self._dispatcher.amqp_uri) as connection:
         exchange = get_event_exchange(self._name)
         exchange.maybe_bind(connection)
         exchange.declare()
Exemple #14
0
 def setup(self):
     self.exchange = get_event_exchange(self.container.service_name)
     self.declare.append(self.exchange)
     super(EventDispatcher, self).setup()
Exemple #15
0
 def setup(self):
     self.exchange = get_event_exchange(self.container.service_name,
                                        self.container.config)
     self.declare.append(self.exchange)
     super(EventDispatcher, self).setup()