收到的COD具有correlationID和body为null

时间:2014-10-21 10:53:43

标签: java jms mule ibm-mq mq

我们正在向Websphere MQ Queue发送消息。在发送消息时,我们正在设置REPLY TO QUEUE NAME和JMSCOrrelationID。我们还设置了USER IDENTIFIER。代码段如下。

Message  msg = session.createTextMessage((String) message);
Destination codeDestination = session.createQueue("queue://" + replyToQueueMgr + "/" + replyToQueueName);
msg.setJMSReplyTo(codeDestination);
msg.setIntProperty(JmsConstants.JMS_IBM_REPORT_COD, MQC.MQRO_COD);
msg.setJMSCorrelationID(msgCorrelId);
 msg.setStringProperty(JmsConstants.JMS_IBM_MQMD_USERIDENTIFIER, "abc");
producer.send(msg);

请注意,我们已确保我们设置的所有字段均不为空。用户abc也是有效用户,因为如果没有,则COD应该转到DEAD LETTER QUEUE,但其中没有消息。在收到消息之后,我们得到一个将JMSCorrelationID作为null的COD。在COD处理器中,我们正在收听replyToQueuename。

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

在检查上面时,相关ID为空。此外,消息有效负载是{null_payload}类型的NullPayload类的mule。我知道body是NULL,因为我们设置了 MQC.MQRO_COD 。但是,我没有考虑如何将相关性消除掉。

请告知Webview MQ端是否有任何可能导致此类行为的配置?或者我们设置标题属性的方式是否缺少某些内容?

更新

我们使用COD信息发送消息的队列是TOPIC的别名。这个TOPIC有2个订阅者,我们观察到当两个订阅者都收到消息时,我们收到了多个COD。在所有订阅者都收到消息后,有没有办法确保TOPIC发送一个COD?这个QM设置是否可能是COD的原因?

2 个答案:

答案 0 :(得分:2)

用户标识

发布消息时,每个订阅者都会获得一条消息副本,其中包含唯一的消息ID,并且MQMD中的标识上下文字段(UserID,AccountingToken,ApplIdentityData)都设置为订阅者的上下文。因此,无论您在发布的消息的MQMD UserID中设置了什么,所有副本都将包含订户用户ID。根据定义,该用户ID将存在于订户所在的位置,以便能够放置COD。

与Pub / Sub相关的ID

通过确保使用MQSO_SET_CORREL_ID进行预订并将MQSO SubCorrelId设置为MQCI_NONE,您可以确保将发布者的相关ID一直发送给订阅者。

多条消息的一个COD

由于存在多条独立消息,每条消息都设置了COD报告选项,因此您将收到多条报告消息。没有设置来组合这些,但是如果您的主应用程序只需要一个,那么您可以编写一个中间应用程序来组合。

在报告消息中传回Correl ID

默认情况下,报告选项将在报告消息的Correl ID中发回消息ID。如果您希望传回Correl ID,则应使用MQRO_PASS_CORREL_ID。

进一步阅读

答案 1 :(得分:0)

问题不在于MQ配置,而在于Mule端点配置。使用nullpayload发送的COD实际上是由我自己的mule应用程序jmsRepyToHandler发送的。 Mule中有一些默认配置似乎导致了这种行为。

<强>分析

  • 应用程序向Queue发送消息,该消息是具有两个订阅者的主题的别名
  • 一旦两个订阅者都消费该消息,我们就会按预期获得2个COD。
  • 这些COD由我的MULE应用程序使用,在处理完MULE应用程序后,再次将COD发送到具有空关联ID的相同队列。

更新:Mule修复以避免默认回复

对于修复,您需要覆盖Mule JMSConnector的 getReplyToHandler 方法,如下所示

if (disableReplyTo) {
  return new DisableJmsReplyToHandler(this, getDefaultResponseTransformers(endpoint));
}else {
  return super.getReplyToHandler(endpoint);
}    

将属性disableReplyTo设置为true,以便上面的代码提供DisableJmsReplyToHandler而不是默认值。