def onMessage(self, payload, isBinary): # echo back message verbatim message = json.loads(payload.decode('utf-8')) metadata = message.get('metadata') event = metadata.get('event') queue_name = metadata.get('queue_name') if event == "SUBSCRIBE": manager = SubscriptionManagerFactory.get_manager(queue_name) dependencies = metadata.get('dependencies', []) # also ensure all subscribers which this subscriber depends upon # are active subscriber = Subscriber(self, metadata) manager.add_subscription(subscriber) setattr(self, 'subscriber', subscriber) for subscriber_id in dependencies: parent = manager.get_subscriber(subscriber_id) if parent is None: print("WARNING: ", "parent subscriber is not found") continue print("Parent ", parent) parent.add_dependent(subscriber) subscriber.add_parent(parent) manager.status() if event == "PUBLISH": payload = message.get('message') msg_hash = MessageStore.add(payload) handler = MessageBufferHandlerFactory.get_handler( queue_name, self.factory.reactor) response = handler.handle_message(msg_hash) self.sendMessage(response.encode('utf-8')) if event == "REQUEST_MESSAGE": msg_hash = self.subscriber.get_message() message = MessageStore.get(msg_hash) payload = { 'metadata': { 'message_hash': msg_hash, }, 'message_body': message } payload = json.dumps(payload) self.sendMessage(payload.encode('utf-8')) if event == "MESSAGE_PROCESSED_ACK": message_hash = metadata.get('message_hash') print("ACK received for message_hash", message_hash) self.subscriber.notify_dependents(message_hash)