2014-03-06 109 views
0

我有從隊列中消費消息的REST服務。我希望按需使用消息 - 給我所有在休息服務被調用時在隊列中可用的消息。ActiveMQ從隊列中按需消耗所有消息

我對Spring使用ActiveMQ。下面是我使用下面的代碼從隊列中獲取消息的代碼。第一次當我打這個服務時,我得到了所有隊列中可用的消息,但是如果我進一步發佈更少的消息,即使我沒有碰到服務,消息也會被訂閱。這可能是什麼原因?

while (true) { 
     try { 
      message = jmsTemplate.receive("TestQ"); 
      if (message instanceof TextMessage) { 
       try { 
        System.out.println(((TextMessage)  message).getText()); 
        msg = ((TextMessage) message).getText(); 
       } catch (JMSException ex) { 
        throw new RuntimeException(ex); 
       } 
      } else { 
       throw new IllegalArgumentException("Message must be of type TextMessage"); 
      } 

     } catch (Exception ex) { 
      break; 
     } 
    } 

回答

0

當您使用方法來接收消息,該線程將阻塞,直到消息變爲可用或者直到超過超時值。這可以從JmsTemplate的Javadoc中找到:

此方法應謹慎使用,因爲直到該消息變得可用,或者直到超時值它會阻止螺紋 是 超過。

阻止的默認超時值爲RECEIVE_TIMEOUT_INDEFINITE_WAIT。所以,即使你沒有訪問服務,由於這個無限期的等待時間,你的最後一個會話線程也會被阻塞。要更改默認的超時值,可以設置接收超時時間爲

jmsTemplate.setReceiveTimeout(RECEIVE_TIMEOUT_NO_WAIT); 

這樣,它不會阻止反而會立即終止,如果目前沒有消息。