2017-04-20 33 views
0

我試圖從隊列中接收消息,如link中所述。 該隊列可能包含多個消息。我想一次讀完。當隊列中沒有消息時,jms接收方法不會停止

問題:

我用下面的方式給出。但是當3分鐘(180000毫秒)後隊列中沒有消息時,我無法看到控制權傳遞給while循環中的其他部分。

因爲我不能夠達到最後的阻止湯姆停止連接。

如在link中給出的那樣,當沒有消息時,我應該接收消息流結束控制消息。但我沒有明白。

由於內部while循環是沒有得到excecuted這個else部分的最後一個塊從入門到達關閉連接

什麼可以是問題?

方法:

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

我們是否應該在while循環或out side while循環中調用session.comiit()?因爲我通過compcode'2'('MQCC_FAILED')原因'2024'('MQRC_SYNCPOINT_LIMIT_REACHED')收回錯誤WebSphere MQ調用失敗閱讀消息。 –

回答

0

該鏈接並沒有說「作爲時,有沒有消息中的鏈接給,我應該接受最終的消息流控制消息。」,第7步表示發送客戶端需要
「發送一個空的控制消息以指示消息流的結束: producer.send(session.createMessage());
發送一個沒有指定類型的空消息是向消費者指示最終消息已經到達的一種便利方式。 「
因此,除非您的消息生產者使用類似示例的無類型空消息來表示對話的最終消息,否則您的接收客戶端將無法按預期工作。

+0

謝謝。接收客戶端不會停止,直到我收到一個沒有指定類型的空消息,對不對?就我而言,製作人永遠不會發送空的控制信息。那麼在connection.session期間,當隊列中沒有消息可用時,可以使用其他方法來停止接收方法? –

+1

@AlagammalP規範說,在接收(超時)方法的情況下,它返回 - 爲此消息使用者生成的下一條消息,如果超時過期或此消息使用者同時關閉,則返回null - 所以如果消息只是跳出循環一片空白。 – Gas

+0

我們應該在while循環中還是在out循環中調用session.comiit()? –