【问题标题】:JMS Correlation ID getting truncatedJMS 相关 ID 被截断
【发布时间】:2014-07-10 18:46:55
【问题描述】:

我将 uuid 字段设置为 JMSCorrelationID 到我的出站消息。我还将回复设置为 Queue 并回复 Quemanger 以获取 COD。设置正确的用户标识符后,我能够在设置的 ReplyTo Q 中接收 COD 消息。但是在 COD 消息中收到的相关 ID 已将我的 UUID 字段的字节截断为 32 个字节。因此,我无法协调收到 COD 的消息。请在发送消息时找到以下代码。我省略了 ReplyToQ 和 ReplytoQm 部分,但它按预期工作。

if(msgUuidId != null){
                    msg.setJMSCorrelationID(msgUuidId);
}
logger.info("Setting IBM_REPORT_COD");
msg.setIntProperty(JmsConstants.JMS_IBM_REPORT_COD, MQC.MQRO_COD);
logger.info("Setting JMS_IBM_MQMD_USERIDENTIFIER to :: "+ userid );
msg.setStringProperty(JmsConstants.JMS_IBM_MQMD_USERIDENTIFIER, userid);

我还在目的地设置 MQMD 上下文

((MQDestination) destination).setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);              
    ((JmsDestination) destination).setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true);
    ((JmsDestination) destination).setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);    
    ((MQDestination) destination).setMQMDMessageContext(WMQConstants.WMQ_MDCTX_SET_IDENTITY_CONTEXT);

在收到消息时,我正在阅读如下内容:。我正在使用 Mule API

String correlationID = (String)eventContext.getMessage().getInboundProperty("JMSCorrelationID");

所以在这里我观察到该值是我设置的 uuid 的截断十六进制部分。有人可以帮我解决这个问题吗?

【问题讨论】:

  • MQ 中的关联 ID 为 24 字节长。如果您使用超过 24 个字节的关联 ID,它将被截断。
  • msUuidId 是什么类型?我似乎记得 JMS 规范区分字节数组和字符串,第一个是特定于提供程序的,而第二个是特定于应用程序的。
  • 但是首先当我没有设置MQMD上下文时,我用来获取相关ID的所有字节?设置 MQMD 上下文后,此问题开始出现?
  • 我们可以将 32 字节的 uuid 设置为标头中可以用来关联的其他字段的一部分,而不是关联 ID??

标签: jms mule ibm-mq mq


【解决方案1】:

Shashi 的评论敲响了警钟。就像 read here 一样,MQ 将 JMSCorrelationId 截断为 48 个十六进制数字/24 个字节:

注意 1:MQMD CorrelId 字段可以包含 48 个十六进制数字(24 个字节)的标准 WebSphere MQ Correlation ID。 JMSCorrelationID 可以是 byte[] 值、包含十六进制字符并以“ID:”为前缀的字符串值,或不以“ID:”开头的任意字符串值。其中前两个表示标准 WebSphere MQ Correlation ID,并直接映射到 MQMD CorrelId 字段或从 MQMD CorrelId 字段映射(如果适用,截断或填充零);他们不使用 MQRFH2 jms.Cid 字段。第三个(任意字符串)使用 MQRFH2 jms.Cid 字段;将字符串的前 24 个字节以 UTF-8 格式写入 MQMD CorrelID。

这是否与您看到的截断相关(双关语)?如果是这样,实用的解决方案是使用 24 字节的相关 ID。

干杯,

【讨论】:

  • 但是首先当我没有设置MQMD上下文时,我用来获取相关ID的所有字节?设置 MQMD 上下文后,此问题开始出现?
  • 我也需要上下文。如果我删除 MQMD 上下文,我会得到相关 ID。但是删除上下文会导致记帐令牌无法通过。我需要会计令牌和相关 ID
  • 你不能只将 corrId 限制为 32 个字节吗?
  • 它是 32 字节...但它被截断为 24 字节。
  • 那么将correlationId限制为24字节?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2012-02-04
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多