Java 接收到的COD的correlationID和正文为null
我们正在向Websphere MQ队列发送一条消息。发送消息时,我们将应答设置为队列名称和JMSCOrrelationID。我们还设置了用户标识符。代码片段如下所示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
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 进一步阅读
- 应用程序向队列发送一条消息,该消息是具有两个订阅者的主题的别名
- 一旦两个订阅者都使用了该消息,我们将获得预期的2个COD
- 这些COD被我的MULE应用程序消耗,在处理之后,MULE应用程序再次将COD发送到具有空相关Id的同一队列
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。