您没有提及 MQ 的版本或是否存在消息亲缘关系或对保留 MQMD.MsgID 的依赖。这些对于设计解决此问题的方法至关重要。我将尝试描述足够多的选项,以便无论您使用什么版本,至少有一个可行。
发布/订阅
最简单的做法是让消息通过主题的别名到达。任何到达的消息都会立即发布在该主题上。然后生成管理订阅以将消息定向到需要消息的应用程序正在侦听的队列是一件简单的事情。这完全是配置更改,不需要外部组件、流程或代码。它可从 MQ v7.1 及更高版本(即任何当前支持的 MQ 版本)开始使用。
不利的一面是,IBM MQ 会将MQMD.MsgID 从主题上接收到消息的时间更改为在应用程序的输入队列上发布的时间。这会破坏应用在回复时使用传入消息的MQMD.MsgID 作为关联 ID 的能力。如果请求应用预加载关联 ID 或不依赖关联 ID,这不是问题。
别名
但是对于存在此问题的应用程序,它变得有点困难。您可以在队列上使用别名,并将入站消息放在别名上。当您需要从一个队列切换到另一个队列时,您需要更改别名。这有几个问题。首先是永远不可能将消息流传递给多个应用程序。在并行处理测试中,通常希望完全做到这一点,然后比较摘要或详细报告。
第二个问题本质上更具操作性。打开时无法更改别名。如果消息通过RCVR、RQSTR 或`CLUSRCVR 频道到达,没问题。停止频道,切换别名并重新启动频道。在一系列 MQSC 脚本命令中,这可以比输入更快地完成。但是,如果放置消息的应用程序以绑定模式或通过客户端直接连接到别名,则必须将它们全部停止才能更改别名。
也就是说,别名适用于所有开箱即用的 MQ 版本。
纸本
已经存在了很长一段时间的一种解决方案是使用Q 程序(SupportPac MA01) 来引导消息。在这种情况下,消息所在的队列是本地队列。 Q 程序要么被触发,要么被设置为持续监听队列。当消息到达时,Q 然后将其复制到一个或两个目标队列。
如果Q 被触发,则切换行为涉及预定义 2 或 3 个进程,每个进程定义不同的行为 - 将新消息移动到 QUEUEA、QUEUEB 或两者。将队列的 PROCESS 属性更改为指向不同的进程会导致行为的瞬时更改。
或者,如果 Q 被配置为永远监听队列,那么改变行为涉及使用三个不同的脚本来执行它,其中一个导致消息被复制到 QUEUEA,另一个到 QUEUEB,另一个到两个队列.更改行为涉及终止脚本并启动另一个脚本。
Q 程序适用于所有版本的 MQ,无论是触发还是脚本化。
这种方法的缺点包括明显的 - 更多的移动部件。您必须触发队列,否则会使事务程序像守护程序一样工作。不难,但如果您将业务押在上面,那么可能会进行一些监控以确保输入队列不会开始构建。
推荐
在所有这些方法中,我真的喜欢 Pub/Sub 版本。它非常可靠,移动部件最少,如果有任何问题,它都在 IBM 支持下。当您需要更改某些内容时,您可以在对正在运行的应用程序产生最小影响的情况下进行更改。如果可能,请使用它。