我想为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中有代码示例,它将非常有用。
答案 0 :(得分:0)
在STOMP中,名为reply-to
的消息头没有什么特别的。 STOMP protocol specification没有提及名为reply-to
的标头,也没有提及出于任何原因创建临时队列的情况。
也就是说,ActiveMQ实现了STOMP的一些扩展,因此,如果您使用以destination
开头的/temp-queue/
头发送消息或创建使用者,则会创建一个临时队列。