Java 接收到的COD的correlationID和正文为null

Java 接收到的COD的correlationID和正文为null,java,jms,mule,ibm-mq,mq,Java,Jms,Mule,Ibm Mq,Mq,我们正在向Websphere MQ队列发送一条消息。发送消息时,我们将应答设置为队列名称和JMSCOrrelationID。我们还设置了用户标识符。代码片段如下所示 Message msg = session.createTextMessage((String) message); Destination codeDestination = session.createQueue("queue://" + replyToQueueMgr + "/" + replyToQueueName); m

我们正在向Websphere MQ队列发送一条消息。发送消息时,我们将应答设置为队列名称和JMSCOrrelationID。我们还设置了用户标识符。代码片段如下所示

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是有效用户,因为如果不是,则CODs应转到死信队列,但其中没有消息。仍然在提取消息之后,我们会得到一个COD,它的JMSCorrelationID为null。在COD处理器中,我们正在侦听replyToQueuename

String correlationID = (String)eventContext.getMessage().getInboundProperty("JMSCorrelationID");
在检查上述相关ID时为空。消息有效负载也是mule的NullPayload类的{null_payload}类型。我知道body将为NULL,因为我们设置了MQC.MQRO_COD。但我不明白关联ID是如何消失的

请告知Webview MQ端是否存在任何可能导致此类行为的配置?或者我们设置标题属性的方式中缺少了什么

更新


我们使用COD信息将消息发送到的队列是主题的别名。此主题有两个订阅者,我们观察到,在某些情况下,当两个订阅者都接收到消息时,我们收到了多个COD。有没有办法确保在所有订阅者都收到消息后,主题发送一个COD?此QM设置是否会导致COD为空?

用户标识符

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

与发布/订阅的关联ID

通过确保使用MQSO_SET_CORREL_ID进行订阅并将MQSO SubCorrelId设置为MQCI_NONE,可以确保发布服务器的相关ID一直发送到订阅服务器

多条消息的一个COD

由于存在多个独立消息,每个消息都设置了COD报告选项,因此您将获得多个报告消息。没有设置将它们组合起来,但是如果主应用程序只需要一个中间应用程序,则可以编写一个中间应用程序进行组合

在报告消息中传回Correl ID

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

进一步阅读


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

分析

  • 应用程序向队列发送一条消息,该消息是具有两个订阅者的主题的别名
  • 一旦两个订阅者都使用了该消息,我们将获得预期的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而不是默认值。

您可能希望将MQRO_COD_与_FULL_数据一起使用。。。此外,getInboundProperty()不是标准的JMS MQ调用。。从getMessage()返回的消息对象类是什么?完整数据可能已过死。您可以使用_数据尝试MQRO_COD_(它只包含100字节的消息数据)。我不需要任何数据。由于类似的配置适用于其他QM上发送的其他消息。使用COD_WITH_FULL_DATA选项,我能够获得CorrelationId和有效负载。但是请注意,COD消息的CorellationId与发送消息时应用程序设置的CorellationId不同。队列管理器获取传入消息的消息id并将其设置为COD消息的相关id,然后将COD消息放入replyToQueue。