我们正在向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的原因?
答案 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中有一些默认配置似乎导致了这种行为。
<强>分析强>
更新:Mule修复以避免默认回复
对于修复,您需要覆盖Mule JMSConnector的 getReplyToHandler 方法,如下所示
if (disableReplyTo) {
return new DisableJmsReplyToHandler(this, getDefaultResponseTransformers(endpoint));
}else {
return super.getReplyToHandler(endpoint);
}
将属性disableReplyTo设置为true,以便上面的代码提供DisableJmsReplyToHandler而不是默认值。