一次从java中的IBM MQ读取多条消息



我有一个下面的代码片段,它从IBM MQ读取一条消息。正在检索该消息以及当前深度。

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条消息,我想读取所有消息,并对每条消息进行一些处理(此处未附加处理代码(。请建议如何实现这一目标。

为什么不创建一个简单的方法,即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;
}

最新更新