【问题标题】:Websphere MQ Cluster/HQ Sticky session with Queue Managers for synchronized messages用于同步消息的队列管理器的 Websphere MQ 集群/HQ 粘性会话
【发布时间】:2016-05-12 17:48:27
【问题描述】:

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

当我们尝试将消息放入前端 QMR1 时,它会进入后端之一并得到处理。但是响应有时会出现 QMR2,而不总是 QMR1。

QN:我们如何在 Websphere MQ / JMS 设置中设置参数以接收来自我们发送的同一 QMR 的消息。

请指教。

【问题讨论】:

  • 您对用于接收前端 QM 中的响应的队列的回复是否也是集群的?

标签: ibm-mq high-availability mq


【解决方案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);                                                
}

可能有更好的解决方案,但以上方法可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多