java - 如何获取特定消息并仅从队列中删除该消息

标签 java browser ibm-mq correlation getmessage

我需要根据相关 ID 从队列中获取特定消息。

有没有一种方法可以让我们获取对应关联 ID 的消息,并只从队列中删除该消息而不删除其他消息。

我尝试过的选项他们检索消息但同时从队列中删除其他消息,同时找到我的消息

我在浏览队列时在 accessQueue 方法中使用了以下 openOptions

MQC.MQOQ_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING | MQC_MQOO_查询 | MQC.MQOOBROWSE

以及以下获取消息的选项

    String correlation ID = <correlationID>

    MQMessage respMessage = new MQMessage();

    respMessage.correlationId = correlation ID.getBytes();

    MQGetMessageOptions msg = new MqGetMessageOptions();    
    msg.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING + MQC.MQGMO_CONVERT + MQC.MQGMO_BROWSE_NEXT

        msg.matchOptions = MQC.MQMO_MATCH_MSG_ID

msg.waitInterval = 2000;

queue.get(respMessage, msg);

最佳答案

您的代码有很多问题。

(1) 如 Morag 所说,如果要从队列中删除消息(即破坏性获取),请删除 MQGMO_BROWSE_NEXT 选项。

respMessage.correlationId = correlation ID.getBytes();
msg.matchOptions = MQC.MQMO_MATCH_MSG_ID

(2) 您正在设置 CorrelId,但随后请求匹配 MsgId。那行不通的。您将获得 MQRC_NO_MSG_AVAILABLE (2033) 的原因代码。

(3) MsgIds 和/或 CorrelIds 永远不应转换为字符串或以字符串开头。 MsgIds 和/或 CorrelIds 将包含二进制数据。因此,MsgIds 和 CorrelIds 应该始终是一个字节数组。即字节[]

这是消息的 MsgId 和 CorrelId 的屏幕截图:

MQ Visual Edit showing a messages MQMD fields

(4) 您有 MQGMO_NO_WAIT 选项,但您将 waitInterval 设置为 2000。如果您希望最多等待 2 秒消息到达,那么您需要使用 MQGMO_WAIT 选项。

MQGetMessageOptions msg = new MqGetMessageOptions();

(5) "msg"是一个糟糕的变量名。它只会让人们感到困惑,因为他们会认为它引用了一条消息。即 MQMessage 类。将变量称为“gmo”要好得多。

MQGetMessageOptions gmo = new MqGetMessageOptions();
gmo.options = CMQC.MQGMO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING + CMQC.MQGMO_CONVERT;
gmo.waitInterval = 2000;
gmo.matchOptions = CMQC.MQMO_MATCH_CORREL_ID;

关于java - 如何获取特定消息并仅从队列中删除该消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948400/

相关文章:

java - 如何使 String 包含 ArrayList 中的每个项目? (JAVA)

java - 如何通过@ManagedProperty 注解注入(inject)整个托管bean?

c# - WPF WebBrowser 控件中的字体平滑

javascript - 动态构建网页 (AJAX) 中的后退/下一步按钮

Javascript event.stopPropagation() 不适用于 `accesskey` 属性

java - 在 Java 中复制大型数组的最有效方法

java - 应用程序被强制关闭,因为 Decimal Formatter

java - 是否可以仅获取本地队列和别名队列的队列名称?

javax.jms.JMSException : MQJMS2002: failed to get message from MQ queue

java - MQJMS2013 无效的安全认证