其他分享
首页 > 其他分享> > 将消息发布到MQ Topic时是否可以使用内置关联?

将消息发布到MQ Topic时是否可以使用内置关联?

作者:互联网

我对WebSphere MQ 7中主题的使用只迷失了一点.假设一个简单的场景:

>我有一个将消息发布到主题的过程.
>我有零个或多个订阅者收到该消息.
>任何订户都可以决定对收到的消息=可选的“答复”作出反应. (旁注:最初的决定是也将主题用于回复,但如有必要,我将其更改为队列)已发布的消息可以配置了ReplyToQueueName,也可以在客户端上进行系统级配置.
>响应必须与原始发布的“请求”相关(因为一个发布的请求可能会多于一个).

现在该怎么做?我尝试从发起者选择其中一个的MQ队列中使用通用方法:

>将报告设置为MQRO_COPY_MSG_ID_TO_CORREL_ID.接收方将从请求中获取消息ID,并将其作为相关ID进行响应.
>将报告设置为MQRO_PASS_CORREL_ID,在请求消息中设置相关ID.接收者将从请求中获取相关ID,并将其设置为响应消息中的相关ID.

在这两种情况下,发送者都知道传递给请求的消息ID或关联ID,因此它可以正确地关联消息,但这不适用于MQ主题.

如果我尝试遵循上述方法,则在发布请求时会立即遇到问题-消息ID未在发布方设置(它为空),因此第一种方法是不可能的.如果我尝试在发布者侧设置相关性ID,那么我将在订户侧获得一个不同的ID,因此我无法将其用于消息相关性(=第二种方法也不可能).

这是一些使用主题(ID在Base64中)时发生的示例:

使用MQRO_COPY_MSG_ID_TO_CORREL_ID进行测试:

Send request: // After sending message publisher doesn't know its ID!
Message Id:     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Received request: // Subscriber gets some ID and correlation ID (but publisher didn't set any)
Message Id:     QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYH
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYF

Send response:  // Subscriber correctly uses message ID of incoming request
Message Id:     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYH

Received response: // Publisher gets in response completely different IDs!
Message Id:     QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYP
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYN

使用MQRO_PASS_CORREL_ID进行测试:

Send request: // Publisher doesn't know its ID but it generated some random correlation ID.
Message Id:     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: Chhv8KT+zhTjfAEdzeiB3cizw9vRy9Pf

Received request: // Subscriber got ANOTHER correlation ID!
Message Id:     QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYY
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYW

Send response:  // Subscriber is using incorrect correlation ID.
Message Id:     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYW

Received response: // Publisher gets in response completely different IDs!
Message Id:     QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYg
Correlation Id: QU1RIExNLnF1ZXVlLm1hbp2OiU4g6AYe

如何强制MQ不更改我的ID?我用Java和.NET编写了测试应用程序,两者的行为方式相同.还是对我的用例来说正确的方法是什么?

解决方法:

您是否考虑过使用JMS(作为实现的MQ)而不是直接使用MQ api对其进行编码?

JMS在发布的消息中已经具有replyTo的概念,并且已经具有将消息链接在一起的correlation id的概念.对于replyTo,发布者可以指定队列或主题,因此您在接收端均不受约束.

标签:publish-subscribe,ibm-mq,java,net
来源: https://codeday.me/bug/20191102/1988149.html