当队列中没有消息时,jms receive方法不会停止

时间:2017-04-20 13:52:28

标签: java-ee jms websphere ibm-mq

我试图从link中提到的队列中收到消息。 队列可能包含多个消息。我想立刻阅读所有内容。

问题:

我使用了以下给出的方法。但是当3分钟(180000毫秒)后队列中没有消息时,我无法看到控件在循环中传递给else部分。

由于这一点,我无法到达终止块tom停止连接。

正如link中没有消息时所给出的那样,我应该收到消息流结束控制消息。但我不明白。

因为其他部分在内部,而循环没有被激活,最后阻止永远不会达到关闭连接

可能是什么问题?

方法:

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();
            }
       }

1 个答案:

答案 0 :(得分:0)

该链接没有说"正如在没有消息的链接中给出的那样,我应该收到消息流结束控制消息。",第7步表示发送客户端需要发送一个空的控制消息来指示消息流的结束: producer.send(session.createMessage());
发送没有指定类型的空消息是向消费者指示最终消息已到达的便捷方式。"
因此,除非您的消息生成器表示与非类型空消息的对话的最终消息,例如例如,您的接收客户端无法按预期工作。

相关问题