我已经开发了一个Java应用程序来从MQ读取消息。Java应用程序必须从MQ中读取所有消息,将它们放入列表中并返回列表。我正在使用while循环来逐一读取消息,如果捕获了2033异常并返回列表,则会中断。我的问题是,阅读单个消息后出现2033异常。例如,我已将大约10条消息推入队列并运行我的应用程序,第一个循环读取了第一条消息并将其放入列表中。但是在第二个循环中,它在获取第二条消息时抛出2033年异常。然后,我需要运行该应用程序以读取第二条消息,并且发生相同的事情。由于我是MQ的新手,所以无法找到导致其发生的路由。我正在使用Java8和IBM MQ核心库。下面是我的代码。package com.reciever.mq;import com.ibm.mq.*;import com.ibm.mq.constants.MQConstants;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.util.*;public class MQReceiver { private static final Logger LOGGER = LoggerFactory.getLogger(MQReceiver.class); private static int GET_OPTIONS_CONSTANT = MQConstants.MQGMO_WAIT | MQConstants.MQGMO_PROPERTIES_COMPATIBILITY | MQConstants.MQGMO_ALL_SEGMENTS_AVAILABLE | MQConstants.MQGMO_COMPLETE_MSG | MQConstants.MQGMO_ALL_MSGS_AVAILABLE | MQConstants.MQGMO_SYNCPOINT; public static MQQueueManager queueManager; public static void main(String[] args) throws MQException { Hashtable<String, Object> mqOptions = new Hashtable<>(); mqOptions.put(MQConstants.HOST_NAME_PROPERTY, "host.name"); //just a placeHolder mqOptions.put(MQConstants.CHANNEL_PROPERTY, "channelName"); mqOptions.put(MQConstants.USER_ID_PROPERTY, "userName"); mqOptions.put(MQConstants.TRANSPORT_PROPERTY, MQConstants.TRANSPORT_MQSERIES); mqOptions.put(MQConstants.PORT_PROPERTY, 1980); queueManager = new MQQueueManager("queueManager", mqOptions); int options = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT | MQConstants.MQOO_FAIL_IF_QUIESCING | MQConstants.MQOO_PASS_ALL_CONTEXT | MQConstants.MQOO_INQUIRE; MQQueue mq = queueManager.accessQueue("queueNametoRead", options); MQException.logExclude(2033);下面是我运行程序后的sysoutsCurrent depth : 9Recieved Message... No more messages.. : 2033Final List size : 1从上面的输出中,它的打印电流深度为9。但是在第二个循环中会断开。
2 回答
![?](http://img1.sycdn.imooc.com/545869470001a00302200220-100-100.jpg)
斯蒂芬大帝
TA贡献1827条经验 获得超8个赞
从队列中获取消息时,将填充消息ID和相关性ID字段。如果使用相同的MQMessage
方式获取下一条消息,则必须首先重置这两个字段。因此,在调用该get
方法之前,请添加这两行。
mqMessage.messageId = MQConstants.MQMI_NONE; mqMessage.correlationId = MQConstants.MQCI_NONE;
![?](http://img1.sycdn.imooc.com/533e4c3300019caf02000200-100-100.jpg)
呼如林
TA贡献1798条经验 获得超3个赞
您还可以在循环内移动MQMessage对象的创建
while(hasMsges){
byte[] buffer = null;
try{
MQMessage mqMessage = new mqMessage();
mq.get(mqMessage, getOptions);
这也将有助于解决问题
添加回答
举报
0/150
提交
取消