MQ api是否支持别名修改

Ala*_*sen 6 java ibm-mq

我可以使用Java MQ Api来放置和获取消息.我也可以禁用获取并放入队列.

在迁移项目期间,我们将有一个并行运行的应用程序.新旧.旧的和新的将有自己独立的队列.我经常收到来自客户的信息.偶尔希望msgs流向New.

想知道MQ是否支持门/开关概念.通过API我可以指向一个队列,只能在短时间内转到New,或者只转到Old.

试图避免通过WMB进行基于消息的路由,因为我今天不必这样做.并行模式仅持续几个月.

T.R*_*Rob 4

您没有提及 MQ 的版本,也没有提及是否存在消息亲缘关系或对保留MQMD.MsgID. 这些对于设计解决该问题的方案至关重要。我将尝试描述足够的选项,以便无论您使用什么版本,至少有一个选项是可行的。

Pub/Sub
最简单的方法是让消息通过某个主题的别名到达。到达的任何消息都会立即发布该主题。然后,生成管理订阅以将消息定向到需要消息的应用程序正在侦听的队列就很简单了。这完全是配置更改,不需要外部组件、流程或代码。它可从 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 都会提供支持。当您需要更改某些内容时,您可以在对正在运行的应用程序产生最小影响的情况下进行更改。如果可能的话,请使用它。