春季JmsTemplate.setMessageId被覆盖

时间:2019-05-14 17:04:21

标签: java spring-jms jmstemplate

我正在探索jmsTemplate实现,但遇到了一个问题。可以将JMSMessageId手动应用于消息,但是回调返回不同的MessageId。

示例代码:

log.debug("Sending request " + jmsMessageId);
final AtomicReference<Message> msg = new AtomicReference<>();
jmsTemplate.send(destinationQueue,
                session -> {
                    Message message = session.createTextMessage(body);
                    message.setJMSMessageID(jmsMessageId);
                    msg.set(message);
                    return message;
                });
log.debug("Request sent " + msg.get().getJMSMessageID());

输出为:

 2019-05-14 15:36:41.308 DEBUG Sending request 2136b3c2-71c7-437a-892f-5e72d27a54f1
 2019-05-14 15:36:41.487 DEBUG Request sent ID:414d51205445535420202020202020204be2be5c02e71527

我期望两个ID相同。 由于IBM提供的文档:

JMS_IBM_MQMD_MsgId属性覆盖JMSMessageID属性的JMS缺省处理。当服务集成将消息转换为WebSphere MQ格式时,服务集成将检查是否已显式设置JMS_IBM_MQMD_MsgId属性。如果是这样,服务集成会将MQMD MsgId字段设置为该值(byte []),并替换JMS分配给消息的JMSMessageID的唯一值。

因此,不应重写显式定义的MsgId,而应仅对其进行编码?我的配置中是否缺少某些东西,或者这是正常现象?

1 个答案:

答案 0 :(得分:1)

setJMSMessageId不执行任何操作-来自the javadocs

  

此方法仅供JMS提供程序使用,以便在发送消息时设置此字段。 客户端无法使用此消息来配置消息ID。此方法是公共的,允许JMS提供程序在发送其实现不是其自己的消息时设置此字段。

(我的重点)。

在任何情况下,措辞都与您正在做的事情相反...

  

JMS_IBM_MQMD_MsgId属性覆盖JMSMessageID属性的JMS缺省处理。 ...

即您必须设置JMS_IBM_MQMD_MsgId属性,它将覆盖生成的JMSMessageID