Websphere MQ Cluster / HQ与队列管理器的粘性会话,用于同步消息

时间:2016-05-12 17:48:27

标签: ibm-mq high-availability mq

我们在Websphere中部署了前端应用程序和后端应用程序,并通过JMS(同步消息)通过IBM MQ进行通信。现在设置集群,前端有2个队列管理器,后端应用程序有2个,使用JNDI配置。

当我们尝试将消息放在前端QMR1中时,它会进入后端之一并进行处理。但有时反应是QMR2而不是QMR1。

问:我们如何在Websphere MQ / JMS设置中设置参数,以便从我们发送的同一QMR中接收消息。

请建议。

1 个答案:

答案 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);                                                
}

可能有更好的解决方案,但上述方法可以胜任。