我可以使用Java MQ Api来放置和获取消息。 我也可以禁用获取并放入队列。
在迁移项目期间,我们将有一个并行运行的应用程序。新旧。旧的和新的将有自己独立的队列。我经常有来自客户的消息去Old。偶尔希望msgs流向New。
想知道MQ是否支持门/交换机概念。通过API,我可以指定一个队列只能在短时间内转到New,或者只转到Old。
试图避免通过WMB进行基于消息的路由,因为我今天不必这样做。并行模式仅持续几个月。
答案 0 :(得分:3)
您没有提及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支持下有任何损坏。当您需要更改某些内容时,可以对运行的应用程序产生最小的影响。如果可能的话,使用它。