2008-12-04 40 views
2

我始終打開JMS連接,因爲我有一個MessageListener。是否需要維護長期居住的JMS連接?

是否需要儘量減少使用長壽命JMS連接維護應用程序的常見需求?

我在想一些嘗試從一些可能的常見的衆所周知的故障中恢復的問題,比如臨時連接故障。

回答

1

標準JMS規範中沒有任何內容可以確保連接問題對應用程序不可見。也許有一些供應商將這作爲延伸(正如James Strachan所建議的那樣)。

如果您想要一個不依賴於供應商擴展的健壯JMS客戶端,您需要處理錯誤並重新連接。見Reconnecting JMS listener to JBossMQ(儘管標題不是JBossMQ特定的)。

1

你將需要處理兩種情況:你和JMS服務器之間

  1. 防火牆。幾個小時後,大多數防火牆都會切斷「閒置」連接。如果是這種情況,請每小時發送一條消息,或者,如果可以,請啓用TCP_KEEPALIVE。這是一個TCP/IP選項,它會導致底層套接字在一段時間後發送測試消息。
  2. 其他服務器重新啓動。發生這種情況時,當您嘗試發送下一條消息時,會出現「連接丟失」錯誤。在這種情況下,再次打開連接並重試。

我建議安裝一個本地JMS服務器(任何都可以),將您的應用連接到它並停止服務器。這會給你錯誤信息期望情況#2。然後用MockRunner編寫一個單元測試,以確保您的錯誤處理是正確的。

3

一個很好的JMS提供者會處理網絡中斷,如掉線插座或消息代理故障轉移或重新啓動正。例如這裏是你如何enable automatic reconnectionApache ActiveMQ

重新創建所有JMS資源(連接,會話,生產者,使用者)往往是一件非常痛苦的事情 - JMS提供者更容易爲您做到這一點。

如果你必須使用它可以不支持此功能的提供者 - 要麼通過交換,或使用Spring JMS輔助類,可以爲你做一些這方面。