为了账号安全,请及时绑定邮箱和手机立即绑定

从Java读取MQ的所有消息时出现问题

从Java读取MQ的所有消息时出现问题

慕的地8271018 2021-05-05 14:20:17
我已经开发了一个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 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

从队列中获取消息时,将填充消息ID和相关性ID字段。如果使用相同的MQMessage方式获取下一条消息,则必须首先重置这两个字段。因此,在调用该get方法之前,请添加这两行。

 mqMessage.messageId     = MQConstants.MQMI_NONE;
 mqMessage.correlationId = MQConstants.MQCI_NONE;


查看完整回答
反对 回复 2021-05-19
?
呼如林

TA贡献1798条经验 获得超3个赞

您还可以在循环内移动MQMessage对象的创建


 while(hasMsges){


            byte[] buffer = null;


            try{

                MQMessage mqMessage = new mqMessage();

                mq.get(mqMessage, getOptions);

这也将有助于解决问题



查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 235 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信