2016-05-12 63 views
0

我們在Websphere中部署了前端應用程序和後端應用程序,並通過JMS(同步消息)通過IBM MQ進行通信。現在,在前端設置2個隊列管理器,在後端應用程序中設置2個集羣,並使用JNDI進行配置。Websphere MQ Cluster/HQ使用隊列管理器實現同步消息的粘性會話

當我們嘗試將消息放在前端QMR1中時,它將進入後端中的任何一個並進行處理。但是有時候QMR2的反應並不總是QMR1。

QN:我們如何設置Websphere MQ/JMS設置中的參數來接收來自我們發送的相同QMR中的消息。

請指教。

+0

您的回覆隊列是否也用於接收前端QM中的響應? –

回答

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

有可能是更好的解決方案,但上述將做的工作。