我可以使用Java MQ Api来放置和获取消息。
我也可以禁用获取并放在队列中。
在迁移项目期间,我们将并行运行一个应用程序。旧的和新的。新旧将有各自的队列。我经常收到来自老客户的消息。有时希望将消息传递给New。
想知道MQ是否支持门/开关概念。通过API,我可以指向一个队列,以便在很短的时间内仅进入新队列或仅进入旧队列。
尽量避免通过WMB进行基于消息的路由,因为我今天不必这样做。并行模式仅持续几个月。
最佳答案
您没有提到MQ的版本,也没有提及消息的亲和性或对保留MQMD.MsgID
的依赖。这些对于设计解决此问题至关重要。我将尽力描述足够的选择,以便无论您使用哪种版本,至少都有一个可行的选择。
发布/订阅
最简单的方法是使消息到达主题的别名。收到的任何消息都会立即在该主题上发布。然后,生成管理订阅以将消息定向到需要消息的应用程序正在监听的队列,这很简单。这完全是配置更改,不需要任何外部组件,过程或代码。它从MQ的v7.1及更高版本开始可用,也就是说,当前支持的任何MQ版本。
不利的一面是,IBM MQ将从接收到有关该主题的消息的时间到在应用程序的输入队列中发布该消息的时间更改MQMD.MsgID
。这样会破坏应用程序在回复时将传入消息的MQMD.MsgID
用作相关性ID的能力。如果发出请求的应用程序预先加载了关联ID或不依赖于关联ID,那么这不是问题。
别名
但是对于这是一个问题的应用程序,它会变得有点困难。您可以在队列上使用别名,并使入站邮件降落在别名上。当您需要从一个队列切换到另一个队列时,可以更改别名。这有几个问题。首先是永远不可能将消息流传递给多个应用程序。在并行处理测试中,通常需要精确地执行该操作,然后比较摘要或详细报告。
第二个问题本质上是更具可操作性。打开别名时,无法更改它。如果消息通过RCVR
,RQSTR
或`CLUSRCVR channel 到达,则没问题。停止 channel ,切换别名并重新启动 channel 。在一系列MQSC脚本命令中,这样做的速度比键入的速度快。但是,如果将消息放置在绑定(bind)模式下或通过客户端直接连接到别名的应用程序,则必须全部停止它们以更改别名。
就是说,别名可以在所有现成的MQ版本上使用。
物理副本
已经存在了很长一段时间的一种解决方案是使用Q
程序(SupportPac MA01)定向消息。在这种情况下,邮件到达的队列是本地队列。 Q
程序被触发或设置为不断监听队列。当消息到达时,Q
然后将其复制到一个或两个目标队列中。
如果触发了Q
,则切换行为涉及预定义2个或3个进程,每个进程定义一个不同的行为-将新消息移至QUEUEA
,QUEUEB
或同时移到这两个消息。将队列的PROCESS
属性更改为指向不同的进程会导致行为的瞬时更改。
或者,如果将Q配置为永远监听队列,则更改行为涉及使用三个不同的脚本执行该脚本,其中一个导致消息被复制到QUEUEA
,另一个导致消息被复制到QUEUEB
,另一个被复制到两个队列。更改行为包括杀死脚本并启动另一个脚本。Q
程序可与所有版本的MQ一起使用,无论它是被触发还是编写脚本。
这种方法的缺点包括明显的-更多的运动部件。您必须触发队列,否则必须使事务程序像守护程序一样工作。并不难,但是如果您将业务押注在它上面,则可能需要进行一些监视,以确保输入队列不会开始建立。
推荐
在所有这些方法中,我真的很喜欢Pub/Sub版本。它非常可靠,部件移动最少,如果有任何故障,请在IBM支持下进行。当您需要更改某些内容时,可以在不影响运行中的应用程序的情况下进行更改。如果可能的话,使用它。
关于java - MQ api支持别名修改吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493632/