gpt4 book ai didi

java - 如何按条件从队列中删除消息?

转载 作者:太空宇宙 更新时间:2023-11-04 09:34:01 25 4
gpt4 key购买 nike

我从 IBM MQ 收到消息。如何按条件从队列中删除消息?

我尝试设置 gmo.options = CMQC.MQGMO_MSG_UNDER_CURSOR;但这对我没有帮助。

MQQueue queue = queueManager.accessQueue(e.getIbmQueue().trim(), CMQC.MQOO_INPUT_SHARED | CMQC.MQOO_FAIL_IF_QUIESCING | CMQC.MQOO_INQUIRE, null, null, null);

MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQGMO_ALL_MSGS_AVAILABLE | MQGMO_WAIT | MQGMO_PROPERTIES_AS_Q_DEF | MQGMO_FAIL_IF_QUIESCING | MQOO_INPUT_AS_Q_DEF | MQGMO_SYNCPOINT;
gmo.matchOptions = MQMO_MATCH_CORREL_ID;
gmo.waitInterval = 50000;
byte[] body = null;
while (true) {
try {
queue.get(msg, gmo);
body = new byte[msg.getMessageLength()];
String businessIdFromIbm = msg.getStringProperty("usr.uuid");
if (businessIdFromIbm.equals("123")) {
//delete message
}
msg.clearMessage();
}

最佳答案

上面示例中的queue.get 调用是破坏性的获取 - 消息将从逻辑上在该调用期间从队列中删除。

您正在使用同步点,因此您需要调用queuemanager.commit()来完成工作单元(或者如果您调用queuemanager.disconnect(),同步点将自动提交)。

MQGMO_MSG_UNDER_CURSOR 仅在您打开队列进行浏览 (CMQC.MQOO_BROWSE) 并至少对队列发出一次浏览以便您的应用程序在其浏览光标下具有有效消息时才有效。

如果您想浏览消息,然后使用第二个queue.get 将其删除以删除浏览光标下的消息,则第一个queue.get 将需要在gmo.options 上指定MQGMO_BROWSE_FIRST 或MQGMO_BROWSE_NEXT;然后第二个queue.get将需要提供MQGMO_MSG_UNDER_CURSOR作为匹配选项,没有设置任何浏览选项,以便破坏性地删除浏览的消息。

MQQueue queue = queueManager.accessQueue(e.getIbmQueue().trim(), CMQC.MQOO_INPUT_SHARED | CMQC.MQOO_BROWSE | CMQC.MQOO_FAIL_IF_QUIESCING | CMQC.MQOO_INQUIRE, null, null, null);

MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = CMQC.MQGMO_ALL_MSGS_AVAILABLE | CMQC.MQGMO_WAIT | CMQC.MQGMO_PROPERTIES_AS_Q_DEF | CMQC.MQGMO_FAIL_IF_QUIESCING | CMQC.MQGMO_BROWSE_NEXT;
gmo.matchOptions = MQMO_MATCH_CORREL_ID;
gmo.waitInterval = 50000;
byte[] body = null;
while (true) {
try {
queue.get(msg, gmo);
body = new byte[msg.getMessageLength()];
String businessIdFromIbm = msg.getStringProperty("usr.uuid");
if (businessIdFromIbm.equals("123")) {
//delete message
MQGetMessageOptions gmo2 = new MQGetMessageOptions();
gmo2.options = CMQC.MQGMO_MSG_UNDER_CURSOR | CMQC.MQGMO_FAIL_IF_QUIESCING | CMQC.MQGMO_SYNCPOINT;
queue.get(msg, gmo2);
// Be prepared to handle the case where the message has been removed by another application (or expired) and so you receive MQRC 2033
queueManager.commit();
}
msg.clearMessage();
}

另一种方法(如果存在问题,则需要更少地调用队列管理器)是使用 MQ 的 JMS API,并在 usr.uuid 上使用选择器,这样只有将此设置为 123 的消息才会返回到应用程序。请参阅https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.dev.doc/q031980_.htm

关于java - 如何按条件从队列中删除消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com