我运行了一个java程序,用于向Mid-Tier IBM MQ编写消息,以便在将主程序附加到它们之前测试功能。 write方法如下所示:
private static void sendSingleMessage(ConnectionFactory connectionFactory,
String[] messages, String destination) throws Exception {
Connection connection = null;
try {
connection = connectionFactory.createConnection();
for (String payload : messages) {
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(destination);
MessageProducer producer = session.createProducer(queue);
Message msg = session.createTextMessage(payload);
System.out.println("Sending text '" + payload + "'");
producer.send(msg);
session.close();
System.out.println("Message sent");
}
} finally {
if (connection != null) {
connection.close();
}
}
}
在此方法执行之前设置connectionFactory,但是在该方法中我设置了MQConncetionFactory属性(主机,端口,通道,队列管理器等等)。这个send方法有效,我可以看到IBM的队列深度增加我从我的main方法调用它时的MQ Explorer。
当我运行类似的readSingleMessage
方法时,代码会卡在consumer.receive()上,永远不会完成执行。见下文:
private static void readSingleMessage(ConnectionFactory connectionFactory,
String[] messages, String destination) throws Exception {
Connection connection = null;
try {
connection = connectionFactory.createConnection();
for (String payload : messages) {
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(destination);
MessageConsumer consumer = session.createConsumer(queue);
System.out.println("Recieving text '" + payload + "'");
consumer.receive();
session.close();
System.out.println("Received message");
}
} finally {
if (connection != null) {
connection.close();
}
}
}
无论如何我可以进一步调试这个,或者找到为什么我能够写入队列但无法从中读取消息?
答案 0 :(得分:2)
您必须通过调用start()
方法启动JMS连接。在连接启动之前,您无法接收任何消息。这在JMS规范和Javadoc中有说明。
顺便说一句,如果您使用JMS 2.0“简化”API并创建一个JMSContext对象(一个本质上是组合的Connection和Session的对象),则不需要调用start来接收消息。从中创建的消费者可用于接收消息而无需显式启动。