【问题标题】:Read multiple messages at a time from IBM MQ in java在 Java 中一次从 IBM MQ 读取多条消息
【发布时间】:2020-08-11 11:05:17
【问题描述】:

我有一个从 IBM MQ 读取消息的以下代码 sn-p。正在检索消息以及当前深度。

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueReceiver;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueue;
import com.ibm.mq.jms.MQQueueConnection;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.mq.jms.MQQueueReceiver;
import com.ibm.mq.jms.MQQueueSession;

public class HelloConsumer {

    /**
     * @param args
     */
    
    public HelloConsumer(){
        
        try {
            
            com.ibm.mq.MQQueue defaultLocalQueue;
            MQQueueManager qManager=null;
            
            MQEnvironment.hostname = "ctmq005";
            MQEnvironment.channel = "CLIENTCONNECTION";
            MQEnvironment.port = 1414;
            String qMngrStr = "";
            qManager = new MQQueueManager(qMngrStr); 
            int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE | MQC.MQ_Q_NAME_LENGTH; 
            String queueName="test.q01";
            System.out.println("accessing::"+queueName);
            defaultLocalQueue = qManager.accessQueue(queueName, openOptions);
            //set transport properties.
            System.out.println("set MQ props");
            MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);
            System.out.println("new Queuemanager");
            //MQMessage putMessage = new MQMessage();
            //String msg = "hello";
           // putMessage.writeUTF(msg);
            
            //specify the message options...
            MQPutMessageOptions pmo = new MQPutMessageOptions(); 
            // accept 
            // put the message on the queue
            //defaultLocalQueue.put(putMessage, pmo);
              
            MQMessage getMessages = new MQMessage();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            System.out.println("get messages::"+gmo.toString());
            defaultLocalQueue.get(getMessages, gmo);
            int depth = defaultLocalQueue.getCurrentDepth();
            byte[] b = new byte[getMessages.getMessageLength()]; 
            System.out.println(depth);
            getMessages.readUTF();
            System.out.println("Message got from MQ: "+new String(b));
        }
        catch(Exception jex){
            jex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        
        new HelloConsumer();

    }

此代码一次仅从队列中读取一条消息。我想一次从队列中读取多条消息。 例如,如果队列中有 4 条消息,我想读取所有消息,然后对每条消息进行一些处理(此处未附加处理代码)。请建议如何实现这一目标。

【问题讨论】:

  • 不,一次获取调用无法读取多条消息。您将始终一次收到(阅读)一条消息。
  • 消息是持久的还是非持久的?
  • 持久消息
  • 您需要像@Shashi 提到的那样进行多次获取。您要解决的用例是什么?如果它们是非持久的,那么 MQ 确实具有预读功能,但这仍然需要您发出多个获取,并且可能没有在 Java 的 IBM MQ 类中实现,只有 JMS。

标签: java ibm-mq


【解决方案1】:

你为什么不创建一个简单的方法,即 getAllMessages 来为你做这件事并让它返回一个 MQMessage 类的 ArrayList。

/**
 * Retrieve the messages as an array
 * @return msgs
 */
public ArrayList<MQMessage> getAllMessages(MQQueue inQ)
{
   private ArrayList<MQMessage> msgs = new ArrayList<MQMessage>();
   MQGetMessageOptions gmo = new MQGetMessageOptions();
   gmo.options = CMQC.MQGMO_NO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING;

   MQMessage getMsg = null;
   boolean getMore = true;

   while(getMore)
   {
      try
      {
         getMsg = new MQMessage();
         inQ.get(getMsg, gmo);
         msgs.add(getMsg);
      }
      catch (MQException e)
      {
         if ( (e.completionCode == CMQC.MQCC_FAILED) &&
              (e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) )
         {
            getMore = false;
            break;
         }
         else
         {
            System.out.println("GET Exception: "+e.getMessage());
            System.out.println("getCause()="+e.getCause());
            getMore = false;
            break;
         }
      }

   }

   return msgs;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多