【问题标题】:How to get specific message and only delete that from the queue如何获取特定消息并仅从队列中删除该消息
【发布时间】:2019-07-09 08:30:05
【问题描述】:

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

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

我尝试过的选项是检索消息,但在查找我的消息时也会从队列中删除其他消息

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

MQC.MQOQ_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING | MQC_MQOO_INQUIRE | 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);

【问题讨论】:

  • 您的获取选项集中似乎有 MQGMO_BROWSE_NEXT。您的问题表明您想删除该消息,而不是浏览它?
  • 您正在设置相关 ID,但您设置的匹配选项是 MQMO_MATCH_MSG_ID。如果要获取匹配相关ID的消息,则需要设置MQMO_MATCH_CORREL_ID。
  • @morag hughson 获取 MQJE001:完成代码 '2',原因 '2033' .... 使用 msg.options = MQC.MQGMO_WAIT + MQC.MQGMO_SYNCPOINT + MQC.MQGMO_FAIL_IF_QUIESCING + MQC 的提及选项.MQGMO_CONVERT
  • @Shashi ... 感谢您指出已进行更改但遇到 MQ 错误“2033”
  • 您如何确定您要求的相关 ID 在队列中。您是否尝试打印出您填写到respMessage.correlationId 的相关ID 的十六进制字节,并将其与运行amqsbcg 示例以浏览队列内容时显示的内容进行比较。 2033 表示没有找到匹配的消息。您的问题并未向我们展示您对相关 ID 的处理,因此我们无法轻易评论您所做的事情。

标签: java browser ibm-mq correlation getmessage


【解决方案1】:

您的代码有很多问题。

(1) 正如莫拉格所说,如果您想从队列中删除消息(即破坏性获取),请删除 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 的屏幕截图:

(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;

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2016-09-21
    • 1970-01-01
    • 2017-04-17
    • 2014-02-24
    • 2012-10-22
    相关资源
    最近更新 更多