从python STOMP创建临时队列

时间:2019-05-14 18:50:10

标签: python activemq stomp

我想为python(stomp)创建临时队列。     他们在文档中提供了reply-to标头。但它不会创建任何临时队列。     用python编写的生产者和使用者文件。  python STOMP是否真的有实现临时队列的方法。

我正在发送带有回复标头的消息。 在订户on_message侦听器中,我正在检查是否存在回复标头,如果存在,则它将响应发送到回复标头值。

队列生产者

import stomp
import json

class QueueProducer:

    def __init__(self):
            self.hosts = ['somevalue']
            self.ports = ['somevalue']
            self.ENCODE_FORMAT = "UTF-8"
            self.conn_param = zip(self.hosts,self.ports)
            self.conn = stomp.Connection11(self.conn_param, encoding=self.ENCODE_FORMAT)
            self.conn.start()
            self.conn.connect(wait=True)
        except Exception as ex:
            raise ex

    def send_msg(self,message,queue_name,header={"JMSDeliveryMode":"Persistent",
                                                 "JMSPriority":4}):
        try:
            message = json.dumps(message)
            self.conn.send(destination='/queue/{}'.format(queue_name), body=message,
                            headers=header)
        except Exception as ex:
            raise ex

if __name__ == "__main__":
    obj = QueueProducer()
    from datetime import datetime
    obj.send_msg(str(datetime.now()),"MessageLife",header={"JMSDeliveryMode":"Persistent",
                                                 "JMSPriority":4,'reply-to':"destination", })

队列消费者:

import sys
import stomp
import time
import json

ACK_CLIENT_INDIVIDUAL = "client-individual"

class CustomListener(stomp.ConnectionListener):

    def __init__(self,conn):
        self.conn = conn

    def on_error(self, headers, message):
        print('received an error::%s' % message)

    def on_message(self, headers, message):
        try:
            message = json.loads(message)
            response = [1,2,3]
            self.conn.ack(headers.get("message-id"), int(headers.get("subscription")))
            if 'reply-to' in headers:
                self.conn.send(destination='/queue/{}'.format(headers.get("reply-to")),
                                body=json.dumps(response))

        except Exception as ex:
            print("exception nack")

class QueueConsumer:

    def __init__(self):
        try:

            self.hosts = ["some value",]
            self.ports = ["some value",]
            self.ENCODE_FORMAT = "utf-8"
            self.conn_param = zip(self.hosts,self.ports)
            self.conn = stomp.Connection11(self.conn_param, encoding=self.ENCODE_FORMAT)
            self.conn.start()
            self.conn.connect(wait=True,)
            self.conn.set_listener('', CustomListener(self.conn))
        except Exception as ex:
            raise ex

    def consume_msg(self):
        try:
            while True:
                self.conn.subscribe('/queue/{}'.format(self.queue_name),1, ack=ACK_CLIENT_INDIVIDUAL,
                                headers={"activemq.prefetchSize":1}
                                )
                time.sleep(500)
                self.conn.unsubscribe(1)
        except Exception as ex:
            raise ex

    def execute(self):
        try:
            self.queue_name = "sample_queue"
            self.consume_msg()
            self.close_connection()
        except Exception as ex:
            raise ex

if __name__ == "__main__":
    obj = QueueConsumer()
    obj.execute()

我真的很想知道回复标头是创建一个像java。(createTemporaryQueue方法)之类的临时队列,还是我们必须手动创建队列(在发送者中还是在消费者中)。 如果有人在python STOMP.py中有代码示例,它将非常有用。

1 个答案:

答案 0 :(得分:0)

在STOMP中,名为reply-to的消息头没有什么特别的。 STOMP protocol specification没有提及名为reply-to的标头,也没有提及出于任何原因创建临时队列的情况。

也就是说,ActiveMQ实现了STOMP的一些扩展,因此,如果您使用以destination开头的/temp-queue/头发送消息或创建使用者,则会创建一个临时队列。