Websphere MQ Cluster / HQ Прикрепленный сеанс с администраторами очередей для синхронизированных сообщений

У нас есть внешнее и внутреннее приложение, развернутое в Websphere, и оно обменивается данными через IBM MQ через JMS (синхронные сообщения). Теперь настраиваем кластер с двумя диспетчерами очередей во внешнем интерфейсе и двумя в серверных приложениях и настраиваем с помощью JNDI.

Когда мы пытаемся поместить сообщение во внешний интерфейс QMR1, оно переходит либо в бэкэнд, либо обрабатывается. Но иногда ответ идет QMR2 и не всегда QMR1.

QN: Как мы можем установить параметры в настройках Websphere MQ / JMS для получения сообщения из того же QMR, которое мы отправили.

Пожалуйста посоветуй.


person user2460282    schedule 12.05.2016    source источник
comment
Сгруппированы ли ваши ответы в очереди для получения ответов в интерфейсных QM?   -  person Attila Repasi    schedule 13.05.2016


Ответы (1)


Вы также сгруппировали очередь ответов. Следовательно, ответные сообщения балансируются между двумя внешними администраторами очередей.

Один из способов отправки ответов правильному адресату - это не кластерные очереди ответов. Вместо этого определите определение удаленной очереди для очередей ответов во внутренних администраторах очередей. Затем используйте атрибут 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);                                                
}

Могут быть лучшие решения, но вышеперечисленное сделает свою работу.

person Shashi    schedule 15.05.2016