我们在Websphere中部署了前端应用程序和后端应用程序,并通过JMS(同步消息)通过IBM MQ进行通信。现在设置集群,前端有2个队列管理器,后端应用程序有2个,使用JNDI配置。
当我们尝试将消息放在前端QMR1中时,它会进入后端之一并进行处理。但有时反应是QMR2而不是QMR1。
问:我们如何在Websphere MQ / JMS设置中设置参数,以便从我们发送的同一QMR中接收消息。
请建议。
答案 0 :(得分:0)
您还对回复队列进行了群集。因此,回复消息在两个前端队列管理器之间进行负载平衡。
将回复发送到正确目标的一种方法不是群集回复队列。而是为后端队列管理器中的回复队列定义远程队列定义。然后使用请求消息的replyToQueueManager
属性来决定并将回复消息放入适当的回复队列。
例如,以下脚本在两个后端队列管理器的每一个中定义了两个远程队列。该脚本假定在两个前端队列管理器中都定义了名为REPLY_QUEUE
的队列。
DEF QREMOTE(REP_Q_FRONT_END_QM1) RNAME(REPLY_QUEUE) RQMNAME(FRONT_END_QM1) CLUSTER(REQUEST_REPLY_CLUSTER)
DEF QREMOTE(REP_Q_FRONT_END_QM2) RNAME(REPLY_QUEUE) RQMNAME(FRONT_END_QM2) CLUSTER(REQUEST_REPLY_CLUSTER)
然后,后端应用程序处理请求消息将打开远程队列。
MQQueue mqReplyQ_QM1 = queueManager.accessQueue("REP_Q_FRONT_END_QM1", CMQC.MQOO_FAIL_IF_QUIESCING | CMQC.MQOO_OUTPUT );
MQQueue mqReplyQ_QM2 = queueManager.accessQueue("REP_Q_FRONT_END_QM2", CMQC.MQOO_FAIL_IF_QUIESCING | CMQC.MQOO_OUTPUT );
然后使用replyToQueueManagerName
属性将回复发送到正确的队列管理器。
MQMessage msgRequest = new MQMessage();
mqRequestQ.get(msgRequest, mqgmo);
if(msgRequest.replyToQueueManagerName.trim().equals("FRONT_END_QM1")) {
mqReplyQ_QM1.put(msgReply);
} else {
mqReplyQ_QM2.put(msgReply);
}
可能有更好的解决方案,但上述方法可以胜任。