class EventBusPublisher(object): def __init__(self, kafka_proxy, config): self.kafka_proxy = kafka_proxy self.config = config self.topic_mappings = config.get('topic_mappings', {}) self.event_bus = EventBusClient() self.subscriptions = None def start(self): log.debug('starting') self.subscriptions = list() self._setup_subscriptions(self.topic_mappings) log.info('started') return self def stop(self): try: log.debug('stopping-event-bus') if self.subscriptions: for subscription in self.subscriptions: self.event_bus.unsubscribe(subscription) log.info('stopped-event-bus') except Exception, e: log.exception('failed-stopping-event-bus', e=e) return
def test_unsubscribe(self): ebc = EventBusClient(EventBus()) sub = ebc.subscribe('news', lambda msg, topic: None) ebc.unsubscribe(sub) self.assertEqual(ebc.list_subscribers(), []) self.assertEqual(ebc.list_subscribers('news'), [])
class EventBusPublisher(object): def __init__(self, kafka_proxy, config): self.kafka_proxy = kafka_proxy self.config = config self.topic_mappings = config.get('topic_mappings', {}) self.event_bus = EventBusClient() self.subscriptions = None def start(self): log.debug('starting') self.subscriptions = list() self._setup_subscriptions(self.topic_mappings) log.info('started') return self def stop(self): try: log.debug('stopping-event-bus') if self.subscriptions: for subscription in self.subscriptions: self.event_bus.unsubscribe(subscription) log.info('stopped-event-bus') except Exception as e: log.exception('failed-stopping-event-bus', e=e) return def _setup_subscriptions(self, mappings): for event_bus_topic, mapping in six.iteritems(mappings): kafka_topic = mapping.get('kafka_topic', None) if kafka_topic is None: log.error('no-kafka-topic-in-config', event_bus_topic=event_bus_topic, mapping=mapping) continue self.subscriptions.append( self.event_bus.subscribe( event_bus_topic, # to avoid Python late-binding to the last registered # kafka_topic, we force instant binding with the default arg lambda _, m, k=kafka_topic: self.forward(k, m))) log.info('event-to-kafka', kafka_topic=kafka_topic, event_bus_topic=event_bus_topic) def forward(self, kafka_topic, msg): try: # convert to JSON string if msg is a protobuf msg if isinstance(msg, Message): msg = dumps(MessageToDict(msg, True, True)) log.debug('forward-event-bus-publisher') self.kafka_proxy.send_message(kafka_topic, msg) except Exception as e: log.exception('failed-forward-event-bus-publisher', e=e)
def test_wildcard_topic(self): ebc = EventBusClient(EventBus()) subs = [] wildcard_sub = Mock() subs.append(ebc.subscribe(re.compile(r'.*'), wildcard_sub)) prefix_sub = Mock() subs.append(ebc.subscribe(re.compile(r'ham.*'), prefix_sub)) contains_sub = Mock() subs.append(ebc.subscribe(re.compile(r'.*burg.*'), contains_sub)) ebc.publish('news', 1) ebc.publish('hamsters', 2) ebc.publish('hamburgers', 3) ebc.publish('nonsense', 4) c = call self.assertEqual(wildcard_sub.call_count, 4) wildcard_sub.assert_has_calls([ c('news', 1), c('hamsters', 2), c('hamburgers', 3), c('nonsense', 4)]) self.assertEqual(prefix_sub.call_count, 2) prefix_sub.assert_has_calls([ c('hamsters', 2), c('hamburgers', 3)]) self.assertEqual(contains_sub.call_count, 1) contains_sub.assert_has_calls([c('hamburgers', 3)]) for sub in subs: ebc.unsubscribe(sub) self.assertEqual(ebc.list_subscribers(), [])