java - 向 MQ 主题发布消息时是否可以使用内置关联?

标签 java .net publish-subscribe ibm-mq

我只是有点迷失在 WebSphere MQ 7 中主题的使用。假设一个简单的场景:

  • 我有一个向主题发布消息的过程。
  • 我有零个或多个订阅者收到消息。
  • 任何订阅者都可以决定对收到的消息使用react = 可选的“回复”。 (旁注:最初的决定也是使用主题进行回复,但如果需要,我会将其更改为队列)发布的消息可以配置 ReplyToQueueName,也可以是客户端的系统级配置。
  • 响应必须与原始发布的“请求”相关(因为发布的请求可能不止一个)。

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

  • 将报告设置为 MQRO_COPY_MSG_ID_TO_CORREL_ID。接收方将从请求中获取消息 ID,并将其作为关联 ID 传递给响应。
  • 将报告设置为 MQRO_PASS_CORREL_ID + 在请求消息中设置关联 ID。接收方将从请求中获取 Correlation ID,并将其设置为响应消息中的 Correlation 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,发布者可以指定队列或主题,因此您在接收端不受任何约束。

关于java - 向 MQ 主题发布消息时是否可以使用内置关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8082197/

相关文章:

java - While循环执行我需要在Java中存储的语句

java - 是否可以在 Hibernate 的同一个项目中同时使用注释和 hbm.xml 文件?

.net - WP7 App部署后立即崩溃

c# - NET 5 在 Entity Framework Core 上添加迁移时出错

javascript - 如何使用链式变量构建类似 namespace 的字符串

java - Payara/Glassfish JAX-RS 多部分

java - Node HMAC 结果不同于 Ruby 和 Java

asp.net - WCF 测试客户端显示 1 个端点,而配置文件公开 3 个端点

node.js - 如何使用 Google PubSub (@google-cloud/pubsub) 进行 ACK

node.js - NodeJS 服务器没有用于 Redis 订阅的 http