2015-05-28 33 views
1

我使用javax.jms.Connection發送&從JBoss501接收jms消息。我也使用Connection.setExceptionListener()。我想知道是否需要在(Conneciton.start())啓動連接之前設置異常偵聽器?任何意見都可以重現JBoss連接異常,以確認是否調用異常偵聽器。JMS ExceptionListener

回答

0

從規格:

如果JMS提供者檢測到一個Connection對象一個嚴重的問題,它會通知Connection對象的的ExceptionListener,如果已註冊。它通過調用偵聽器的onException方法來完成此操作,並向它傳遞一個描述問題的JMSException參數。

異常偵聽器允許客戶端異步通知問題。有些連接只會使用消息,因此他們無法通過其他方式瞭解連接失敗。

請記住,這裏有供應商特定實施的地方,介紹如何處理異常。一些供應商儘可能「修復」這種情況。

現在,關於在設置異常監聽器之前或之後啓動連接... 在開始連接之前,始終設置異常偵聽器。

約重現我想你可以

  • 啓動消費,connection.start應該運行。並等待消息。
  • 立即關閉jboss。
  • 重新啓動jboss。

我也知道,使用Eclipse或其他開發工具將幫助你在調試模式下啓動,您也可以在作爲調試器顯示您地位的任何特定的時間剛剛中止了JBoss服務器,並再次重新啓動它。

1

使用Jboss 5.0.1,即使在開始連接後,設置異常偵聽器也能正常工作。正如「MrSimpleMind」所提到的,異常監聽器在啓動連接之前可以更好地服務 - 事實上,只要從ConnectionFactory創建連接,它就是最好的。

的異常監聽器是有效的,即使連接未啓動 - 在JBoss中501

//Main  
try { 
     connection = getConnection(); 
     connection.setExceptionListener(new MyExceptionListener()); 
     //Exception listener is effective even before connection is started. 
     //connection.start(); 
     while(true){ 
      try { 
       Thread.sleep(1000 * 5); 
       Log.l("Kill the JMS provider any time now. !! Observe if the JMS listener works."); 
      } catch (InterruptedException e) { 
       //do nothing. 
      } 
     } 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (JMSException e) { 
     e.printStackTrace(); 
    } 

    //Exception Listener 
    public class MyExceptionListener implements ExceptionListener { 

    @Override 
    public void onException(JMSException e) { 
      Log.l("Exception listener invoked"); 
    } 
    } 

要重現其中的ExceptionListener被觸發/調用場景的情況下,我使用JBoss的管理控制檯並使用由Jboss mgmt控制檯公開的mx bean停止ConnectionFactory。

+0

與反饋和您與SO社區共享很好。 +1 – MrSimpleMind