【发布时间】:2023-03-26 13:57:01
【问题描述】:
我已尝试从link 中提到的队列中接收消息。 队列可能包含多条消息。我想一口气读完。
问题:
我使用了下面给出的方法。但是当 3 分钟(180000 毫秒)后队列中没有消息时,我看不到控件被传递给 while 循环内的 else 部分。
因此,我无法到达 finally 块 tom 停止连接。
正如link 中给出的,当没有消息时,我应该会收到消息流结束控制消息。但我不明白。
由于 while 循环中的 else 部分没有被执行,并且 finally 块永远不会到达关闭连接
可能是什么问题?
方法:
import javax.naming.InitialContext;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSession;
import javax.jms.QueueReceiver;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
public class Receiver
{
@Resource(lookup = "jms/ConnectionFactory")
private static QueueConnectionFactory connectionFactory;
@Resource(lookup = "jms/Queue")
private static Queue queue;
public void readQueueMessages() {
try {
// create a queue connection
QueueConnection queueConn = connFactory.createQueueConnection();
// create a queue session
QueueSession queueSession = queueConn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
// create a queue receiver
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
// start the connection
queueConn.start();
// receive a message
while(true) {
TextMessage message = (TextMessage) queueReceiver.receive(180000);
if (message != null) {
if (message instanceof TextMessage) {
/ print the message
System.out.println("received: " + message.getText());
} else {
break; // when the end-of-message stream control is message is received, that cannnot be of Textmessage type. So the loop should terminate.
}
}
}
} catch(JMSException exp) {
// Handle this exception
} finally {
if(queueConn != null) {
// close the queue connection
queueConn.close();
}
}
【问题讨论】:
-
我们应该在 while 循环内还是在 while 循环外调用 session.comiit()?因为我收到错误 WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2024' (' MQRC_SYNCPOINT_LIMIT_REACHED') 虽然我阅读了消息。
标签: jakarta-ee jms websphere ibm-mq