WMQ消息组并行执行

时间:2015-11-26 20:18:01

标签: ibm-mq

我需要在消费者关闭时在队列中存储大量消息,并在恢复消费者时按顺序处理它们。我想将逻辑相关的消息组合在一起并并行执行所有组。

例如:考虑下面的队列,有3组A,B,C。我已经正确地为组分配了seqnum和唯一的groupIds。 队列-1 A1,A2,A3-最后,B1,B2-最后,C1,C2,C3,C4-最后

  1. 是否可以并行获取A1,B1,C1?
  2. 目前,消费者正在按顺序正确获取A1,A2和A3。但它无法从B组或C组中获取任何内容。可能有什么问题?
  3. 任何建议都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

首先从MQ Knowledge中读取此page

我将伪代码(从上面的网页)转换为Java的Java类,并将其从浏览转换为破坏性的获取。

另外,我更喜欢在同步点下进行每组消息(假设组合小的组合)。

MQGetMessageOptions gmo = new MQGetMessageOptions();
MQMessage rcvMsg = new MQMessage();

/* Get the first message in a group, or a message not in a group */
gmo.Options = CMQC.MQGMO_COMPLETE_MSG | CMQC.MQGMO_LOGICAL_ORDER | CMQC.MQGMO_ALL_MSGS_AVAILABLE | CMQC.MQGMO_WAIT | CMQC.MQGMO_SYNCPOINT;
gmo.MatchOptions = CMQC.MQMO_MATCH_MSG_SEQ_NUMBER;
rcvMsg.messageSequenceNumber = 1;
rcvMsg.groupId = CMQC.MQGI_NONE;
inQ.get(rcvMsg, gmo);

/* Examine first or only message */
 ...

gmo.Options = CMQC.MQGMO_COMPLETE_MSG | CMQC.MQGMO_LOGICAL_ORDER | CMQC.MQGMO_SYNCPOINT;
do while ((rcvMsg.messageFlags & CMQC.MQMF_MSG_IN_GROUP) == CMQC.MQMF_MSG_IN_GROUP)
{
    rcvMsg.clearMessage();
    inQ.get(rcvMsg, gmo);
   /* Examine each remaining message in the group */
   ...
}
qMgr.commit();

必须完成一些编码工作:(1)使用正确的选项,(2)在获得下一组之前清除groupId字段。