如何获取特定消息并仅将其从队列中删除

时间:2019-07-09 08:30:05

标签: java browser ibm-mq correlation getmessage

我需要根据其相关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);

1 个答案:

答案 0 :(得分:2)

您的代码有很多问题。

(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)绝对不要将MsgId和/或CorrelId转换为字符串或以字符串开头。 MsgId和/或CorrelId将包含二进制数据。因此,MsgIds和CorrelIds应该始终为字节数组。即byte []

这是邮件的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;