我需要在消费者关闭时在队列中存储大量消息,并在恢复消费者时按顺序处理它们。我想将逻辑相关的消息组合在一起并并行执行所有组。
例如:考虑下面的队列,有3组A,B,C。我已经正确地为组分配了seqnum和唯一的groupIds。 队列-1 A1,A2,A3-最后,B1,B2-最后,C1,C2,C3,C4-最后
任何建议都会有很大帮助。
答案 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字段。