Exemple #1
0
    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)