我使用Python向ActiveMQ Artemis上的队列发送STOMP消息。但是,当我的Spring应用程序接收到消息时,我得到:
NoJMSMessageIdException: MISSING_JMS_MESSAGE_ID.我试图像头或属性一样设置不同的值,如JMSMessageID、msgID、MESSAGE_ID等。
我发现我的应用程序使用这种方法验证消息。我试着把它和id一起发送,但是没有帮助。它期望什么?如何用Python中的脚发送它?
Python客户端文档有这样的例子,但是它没有解释如何发送这个JMS:
发送(目的地、正文、content_type=None、headers=None、**keyword_headers)向消息传递系统中的目的地发送消息(根据https://stomp.github.io/stomp-specification-1.2.html#SEND)参数:
我的代码:
import stomp
import json
jsonRequest = {
"data": {
"key": "value"
}}
class MyListener(stomp.ConnectionListener):
def on_error(self, frame):
print('received an error "%s"' % frame.body)
def on_message(self, frame):
print('received a message "%s"' % frame.body)
conn = stomp.Connection([('host', 63001)])
conn.set_listener('', MyListener())
conn.connect('user', 'password', wait=True)
conn.subscribe(destination='queue', id=1, ack='auto')
conn.send(destination='queue', body=json.dumps(jsonRequest), MESSAGE_ID='e5bf8c3d-0dc4-11ed-a28a-544d36153f8c', JMSMessageID='ID:e5bf8c3d-0dc4-11ed-a28a-544d36153f5c', headers={'MESSAGE_ID': 'ID:e5bf8c3d-0dc4-11ed-a28a-544d36153f5c', 'JMSCorrelationID': '123278256677', 'JMSReplyTo': 'queue'},
MSGUID="3e4fb627-85df-4b37-b37b-1070c7893c99", TotalNumberMsg=1, CurrentNumberMsg=1, UIPSYSTEMDATA=72)
test = MyListener()我在后端服务日志中有错误:
2022-07-27 20:10:53 [,] [DefaultMessageListenerContainer-2] ERROR service.jms.listener.base.AbstractArtemisMessageListener - Exception while processing message MISSING_JMS_MESSAGE_ID
service.exception.NoJMSMessageIdException: MISSING_JMS_MESSAGE_ID当我通过JMS ToolBox发送消息时,它具有以下id:
2022-07-27 18:58:03 [,] [DefaultMessageListenerContainer-2] INFO service.jms.listener.base.AbstractArtemisMessageListener - Message from srv: ActiveMQMessage[ID:e5bf8c3d-0dc4-11ed-a28a-544d36153f0c]:PERSISTENT/ClientLargeMessageImpl[messageID=318412845, durable=true, address=queue,userID=e5bf8c3d-0dc4-11ed-a28a-544d36153f0c,properties=TypedProperties[__AMQ_CID=JMSToolBox-1657948224556,TotalNumberMsg=1,JMSReplyTo=queue://,_AMQ_ROUTING_TYPE=1,MSGUID=3e4fb627-85df-4b37-b37b-1070c7893c82,SERVICENAME=service,JMSCorrelationID=5515D5431364567,_AMQ_VALIDATED_USER=ACTIVEMQ.CLUSTER.ADMIN.USER,CurrentNumberMsg=1,UIPSYSTEMDATA=063224508,_AMQ_LARGE_SIZE=308737]] with correlationId: 5515D5431364567通过STOMP,它具有空值:
2022-07-27 19:12:52 [,] [DefaultMessageListenerContainer-2] INFO service.jms.listener.base.AbstractArtemisMessageListener - Message from srv: ActiveMQMessage[null]:NON-PERSISTENT/ClientLargeMessageImpl[messageID=318581407, durable=false, address=queue,userID=null,properties=TypedProperties[content-length=110919,destination=queue,JMSReplyTo=queue,TotalNumberMsg=1,_AMQ_ROUTING_TYPE=1,MSGUID=3e4fb627-85df-4b37-b37b-1070c7893c99,SERVICENAME=service,JMSCorrelationID=123278256677,_AMQ_VALIDATED_USER=ACTIVEMQ.CLUSTER.ADMIN.USER,CurrentNumberMsg=1,UIPSYSTEMDATA=72,_AMQ_LARGE_SIZE=110919,messageID=125774553292,JMSType=NULL-value]] with correlationId: 123278256677发布于 2022-07-27 20:51:00
JMS 2规范第3.4.3节规定(强调地雷):
JMSMessageID标头字段包含一个值,该值唯一标识由提供程序发送的每个消息。 当发送消息时,JMSMessageID将被忽略。当send方法返回时,它包含一个provider-assigned值。
JMS1.1规范第3.4.3节中也有相同的基本文本。
这里说明的要点是,当应用程序使用“提供者”提供的JMS库发送消息时,JMSMessageID被分配给消息(本例中为ActiveMQ Artemis )。但是,您是而不是,它使用JMS库发送消息。你用STOMP客户端库发送了一条消息。因此,消息没有分配给它的JMSMessageID。
此外,设置JMSMessageID实际上也是可选的,即使对JMS也是如此。见javax.jms.MessageProducer#setDisableMessageID。
因此,如果service.jms.listener.base.AbstractArtemisMessageListener返回null是完全有效的,那么您的null类不应该认为它是一个错误。
https://stackoverflow.com/questions/73142471
复制相似问题