java - 如何在同一个函数中浏览来自2个不同MQQueue的所有消息?

标签 java ibm-mq

我的目的是列出 Java 应用程序中一组 MQ 队列中消息的相关 ID。

这是代码片段

public void populateCorrelationIds() throws MQException{
    int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INQUIRE | MQConstants.MQOO_BROWSE;
    String qNames[0] = BAY10.CISCHGX.DFDA;
    String qNames[1] = BAYSF11.MSFCHGX.DFDA;
    MQMessage messageGet = new MQMessage();
    for(String q : qNames){
        MQQueue dfdaQ  = qMgr.accessQueue(q, openOptions);
        MQGetMessageOptions gmo = new MQGetMessageOptions();
        gmo.options = MQConstants.MQGMO_BROWSE_FIRST| MQConstants.MQGMO_WAIT;
        gmo.waitInterval = 4000;
        int j = dfdaQ.getCurrentDepth();
        for(int i=0;i<j;i++)
        {
            dfdaQ.get(messageGet,gmo);  //Error generated here when getting message for qNames[1]
            byte[] correlId= messageGet.correlationId;
        }
    }
}

下面是我收到的错误 -

MQJE001: Completion Code '2', Reason '2033'. com.ibm.mq.MQException: 
MQJE001: Completion Code '2', Reason '2033'. at    
com.ibm.mq.MQDestination.getInt(MQDestination.java:655) at 
com.ibm.mq.MQDestination.get(MQDestination.java:459) at 
Utility.populateCorrelationIds(Utility.java:152) at 
Utility.main(Utility.java:64) MQJE001: Completion Code '2', Reason '2033'.

这是我运行代码时遇到的错误。请注意,当我从下一个队列的队列中获取消息时,会发生错误。我成功地浏览了第一个队列的所有消息。但是,当我浏览第二个队列中的第一条消息时,我就会收到上述错误。任何人都可以帮助解决此错误。

最佳答案

这里有几点需要注意:

第一个是因为你正在初始化MQMessage第一个之外的对象 for环形。它必须在第二个 for 内循环,因为 MQ 用 MessageId 填充该对象, CorrelationId 、消息正文等,当MQQueue.get时调用返回。如果你做get再次调用相同的 MQMessage对象实例,您实际上正在尝试使用先前检索到的消息的 MessageId 来获取消息。此调用失败,原因代码为 2033。

关于您的代码还有一些其他要点。

1) 你必须做 new MQGetMessageOptions()在第二个for内循环。

2) 您正在使用 BROWSE_FIRST 选项。这将仅浏览第一条消息。要浏览所有消息,您必须执行 getBROWSE_NEXT选项。当您打开队列时,浏览光标逻辑上位于队列中第一条消息之前。这意味着如果您将 get您调用 accessQueue 后立即调用调用电话,您可以使用MQGMO_BROWSE_NEXT浏览第一条消息的选项;您不必使用MQGMO_BROWSE_FIRST选项

3) 如果为 browse 打开队列仅此,则无需指定 MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INQUIRE打开选项。

4) getCurrentDepth() 方法返回调用时的队列深度。当您的应用程序正在浏览时,其他一些应用程序可能会从同一队列获取消息。在这种情况下,当前队列深度将会更改,但您的应用程序不会收到更改通知。所以不要使用 dfdaQ.getCurrentDepth() ,你可以简单地使用 MQGMO_BROWSE_NEXT 来获取while 中的选项环形。当没有消息可供浏览时,get 调用将返回 2033 原因代码。您可以检查此原因代码并退出 while 循环。

关于java - 如何在同一个函数中浏览来自2个不同MQQueue的所有消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460341/

相关文章:

size - 如何通过 JMS 向 WebSphere MQ 发送大消息?

java - 如何在 Java 中从 MQ 系列死信的有效负载 (byte[]) 中分离 RFH2(字符串)?

ibm-mq - WMQ将消息复制到另一个队列

java - MQ - 查看消息 - 文本限制

java - AppEngine 日志记录限制

java - 当我使用gradle5.0构建我的项目时,导致了java.lang.OutOfMemoryError : Java heap space.如何解决?

java - maven 没有下载我添加的任何依赖项

java - CTabFolder布局控件不渲染

java - 用于扫描的简单 try & catch 代码不适用于十进制值

ibm-mq - Websphere MQ 和高可用性