【发布时间】: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。