2009-10-02 181 views
1

我正在使用Glassfish JMS。JMS客戶端不會收到消息

我可以將消息添加到隊列中。 我可以使用QueueBrowser對象查看消息。 但是,MessageConsumer(或QueueReceiver)不能接收任何消息並返回null。 消息過期設置爲0,我記得打開連接。

任何想法?

下面是代碼:

 Session session = null; 
     Connection conn = null; 

     try 
     { 
     InitialContext jndi = new InitialContext(); 

      ConnectionFactory qFactory = (ConnectionFactory)jndi. 
       lookup("myConnectionFactory"); 
       conn = qFactory.createConnection(); 
       conn.start(); 
     Queue queue = (Queue)jndi.lookup("myQueueName"); 
     session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 


      QueueReceiver mc = ((QueueSession)session).createReceiver(queue); 

     Object m = mc.receive(2000); 
     //m is NULL! 

     QueueBrowser browser = session.createBrowser(queue); 


     for(Enumeration e = browser.getEnumeration(); e.hasMoreElements();) 
     { 
      //there are many messages here... 
     } 
+1

要顯示的任何代碼?它可能會幫助你知道...... – 2009-10-02 21:38:19

回答

1

這將是很好的客戶端代碼。

類似的事情發生在我沒有正確提交/關閉發送方的連接。該消息在使用管理控制檯時可見,但尚未提供給MDB。

希望它有幫助。

0

此代碼是否在應用程序服務器中運行?如果是這樣,我會通過註釋獲取所需的對象,而對於消息接收者,我會使用MDB。 如果這是一個獨立的代碼,我有一段時間讓基於JNDI的客戶端工作,我恢復使用「原始」Java API。

0

我目睹了第一次會話提交後發生的相同行爲,這意味着在收到正確的郵件之前。在我的情況下,問題是我正在重新創建接收器,同時保持相同的會話。 作爲this article指出:

創建臨時目的地,消費者,生產者和連接 是與經紀人所有同步請求 - 響應操作等 應避免處理每個請求,因爲它導致很多 與JMS經紀人聊天。

解決方案與重複使用同一個接收器一樣簡單。

相關問題