2014-01-06 36 views
1

在下面的代碼片段:使用JMS處理JMSExceptions,特別是ActiveMQ?

Connection connection=getConnection(); 
try { 
    Session session=connection.createSession(); 
    try { 
     Queue queue=session.createQueue("foobar"); 
     MessageConsumer consumer=null; 
     try { 
      consumer = session.createConsumer(queue); 
     } 
     catch(JMSException e) { 
      // Under what circumstances does this happen? 
     } 
     try { 
      // ... 
     } 
     finally { 
      if(consumer != null) consumer.close(); 
     } 
    } 
    finally { 
     session.close(); 
    } 
} 
finally { 
    connection.close(); 
} 

在什麼情況下被卡住JMSException拋出?當它發生時,處理JMSException的正確方法是什麼?我已經閱讀了JMS和ActiveMQ文檔的相關部分,並且似乎沒有給出任何關於此點的指導(顯然,除了使用try/catch以外)。另外,請原諒代碼示例!

例如,做了JMSException發生,如果session以某種方式「壞了」,所以它的正確的事情推倒consumersession並重新開始?或者這是否意味着connection壞了,所以我應該拆除並重建基於該連接的應用程序中的所有內容?或者createConsumer()的呼叫可能暫時失敗,並且使用同一會話重試呼叫可能會成功?

同樣,當將這些行拋出一個JMSException,忽略像一個封閉的SessionConnection

Message message=consumer.receive(); 
producer.send(message); 

我想了解如何JMSException S的關係在JMS一般進行處理,但具體的答案到ActiveMQ也很好。 (事實上​​,很可能任何答案都必須針對特定實現,因爲JMS只是一個規範。)

回答

1

由於多種原因,可能會拋出異常。最常見的情況是,由於網絡或經紀人失敗,連接丟失。其他原因可能是代理資源耗盡,安全違規等。

爲避免網絡連接問題引起的異常,可以使用ActiveMQ的故障轉移傳輸器讓客戶端自動重新連接。 JMS中有許多異常類型,因此您可以測試給定的錯誤,例如檢查消費者創建或生產者發送是否因安全異常而失敗。如果您不知道實際的原因,那麼最常見的事情就是拆卸並重建連接資源。這就是爲什麼使用故障轉移更好,因爲您可以通過讓客戶端處理檢測並響應此操作來避免大量工作。

+0

精彩的回答。正是我需要知道的。謝謝蒂姆! – sigpwned