【问题标题】:Spring JmsTemplate.setMessageId is overriddenSpring JmsTemplate.setMessageId 被覆盖
【发布时间】:2019-05-14 17:04:21
【问题描述】:

我正在探索 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 不应该被覆盖,只能编码?我的配置中是否缺少某些内容或者这是正常行为?

【问题讨论】:

    标签: java spring-jms jmstemplate


    【解决方案1】:

    setJMSMessageId 什么都不做 - 来自 the javadocs

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

    (我的重点)。

    无论如何,措辞与您正在做的相反......

    JMS_IBM_MQMD_MsgId 属性覆盖 JMSMessageID 属性的 JMS 默认处理。 ...

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

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多