MQ MessageConsumer 不响应 receive() 方法
MQ MessageConsumer does not respond to receive() method
我有一个 java 程序,我 运行 将消息写入中层 IBM MQ 以测试功能,然后再将我们的主程序附加到它们。写入方法如下所示:
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 属性(主机、端口、通道、queuemanager 等...)此发送方法有效,我可以看到队列深度增加当我从我的主要方法调用它时我的 IBM 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();
}
}
}
无论如何我可以进一步调试它,或者找出为什么我能够写入队列,但无法从中读取消息的原因?
您必须通过调用 start()
方法来启动 JMS 连接。在连接启动之前,您无法接收任何消息。 JMS 规范和 Javadoc 中对此进行了说明。
顺便说一句,如果您使用 JMS 2.0 "simplified" API 并创建一个 JMSContext 对象(一个本质上是 Connection 和 Session 组合的对象),您不需要调用 start 来接收消息。从中创建的消费者可用于接收消息而无需显式启动。
我有一个 java 程序,我 运行 将消息写入中层 IBM MQ 以测试功能,然后再将我们的主程序附加到它们。写入方法如下所示:
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 属性(主机、端口、通道、queuemanager 等...)此发送方法有效,我可以看到队列深度增加当我从我的主要方法调用它时我的 IBM 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();
}
}
}
无论如何我可以进一步调试它,或者找出为什么我能够写入队列,但无法从中读取消息的原因?
您必须通过调用 start()
方法来启动 JMS 连接。在连接启动之前,您无法接收任何消息。 JMS 规范和 Javadoc 中对此进行了说明。
顺便说一句,如果您使用 JMS 2.0 "simplified" API 并创建一个 JMSContext 对象(一个本质上是 Connection 和 Session 组合的对象),您不需要调用 start 来接收消息。从中创建的消费者可用于接收消息而无需显式启动。