【发布时间】:2011-11-10 15:44:44
【问题描述】:
我只是有点迷失在 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 编写了测试应用程序,它们的行为方式相同。或者我的用例的正确方法是什么?
【问题讨论】:
标签: java .net publish-subscribe ibm-mq