如何正确设置JMSMessageID和JMSCorrelationID?

Xan*_*hos 4 java jms ibm-mq

我创建了一个使用JMS将消息发送到MQ队列的Java应用程序.我使用setJMSMessageId()和setJMSCorrelationId()设置消息id和相关id.发送结束时,messageId似乎被覆盖.我google了一下,似乎服务器会覆盖messageId,即使你发送它也是如此.

此应用程序的要求是messageId和correlationId在发送和接收时都具有相同的值.我能做些什么吗?

注意:我使用JDK 1.6和WAS 8.5来部署应用程序.此WAS与MQ队列管理器通信.

rü-*_*rü- 6

消息ID保留给消息传递系统进行设置.你可以阅读它,例如记录甚至坚持它,但没有别的.Esp.,它不应该由应用程序设置!只有在两个消息传递系统之间进行桥接时,setter才会存在,即当您从一个消息传递系统X收到消息并将其转发到另一个消息传递系统Y时.然后Y需要能够设置该消息对象的消息ID,甚至虽然Y没有创建它,即使它不是Y自己的实现.这个用例有几种方法,它引起了很多混乱; 最好忽略它们.

OTOH,相关ID是供您的应用程序使用的.一种非常常见的模式是请求 - 响应消息对,这是混淆的第二个来源:

  1. 原始发件人A向目的地D发送消息,其中回复标题字段设置为目的地D',其中A期望接收回复.当A调用其中一种send方法时,消息ID由消息传递系统设置,A存储此消息ID.
  2. 然后B接收消息,处理业务逻辑,并回复D'.它还将相关ID设置为刚收到的消息的消息ID.回复消息还从消息传递系统获取新的消息ID,但这与此模式无关.
  3. 最后,A从D'接收回复消息,读取相关ID,并使用它来查找它在步骤1中存储的消息ID.

还有许多其他消息交换模式,例如一个请求多个回复或未经请求的消息,并且正确使用相关性ID是必不可少的; 但请求 - 回复是目前最常见的.这就是为什么它甚至在JavaDoc中提出.否则消息ID与关联ID无关.这对初学者来说很困惑.我甚至发现最好将消息与业务密钥而不是消息ID相关联.

回到你的问题:在发送消息之前设置相关id,并且在发送消息时消息系统设置消息id,JMS-API中没有办法使两个值都相同.


Rog*_*ger 2

我使用 setJMSMessageId() 和 setJMSCorrelationId() 设置消息 id 和相关 id。

无论谁告诉你这样做,他都不了解正确的消息传递设计,也不应该设计中间件基础设施。消息 ID 在 MQ 环境中应该是唯一的。如果您需要在 2 个消息传递应用程序之间共享令牌/数据值,请使用相关 ID。