2012-02-02 44 views
1

我有一個3個經紀人的網絡正在運行,但有時經紀人以一種相當獨特和煩人的方式失敗。客戶在創建會話時被卡住

他們仍然接受連接,但停止與客戶端(甚至那些仍然連接)進行通信。 在Java這創造了新的連接方式:

con = factory.getConnection(); // method returns, connection is created 
con.createSession(false, Session.AUTO_ACKNOWLEDGE); // never returns 

在服務器端沒有在調試模式下運行時登錄異常。

你知道這裏發生了什麼嗎? 有沒有我可以找的任何logmessage?

編輯: 一些額外的信息:

  • http://pastebin.com/9iztG67D - XML配置文件
  • 每個節點是與一個連接的從主節點(純主從)
  • 客戶URI:故障切換:(TCP :// serverA的:61616,TCP:// serverB上:61616,TCP://服務器C:61616,TCP:// serverA的從站:61616,TCP:// serverB上從站:61616,TCP://服務器C從站:61616)?randomize = false
+0

這很可能不是這種情況,但只是爲了確保在BOX上釋放空間/內存/ CPU等? – Eugene 2012-02-03 07:27:07

+0

您是否在客戶端連接URI中使用故障轉移?請添加更多關於客戶端配置的信息。 – 2012-02-03 19:18:24

+0

添加客戶端uri – Laures 2012-02-05 10:36:09

回答

0

不知道你的經紀人是如何配置的,以及你使用的是什麼樣的隊列/話題結構,有點難以確切地知道發生了什麼。但是根據您所描述的一般行爲,這聽起來像是某種程度上的流量控制。

查看here瞭解更多流量控制的詳細說明。基本上,如果您的目的地由於消費緩慢或掛起而被填滿並達到其內存限制,則當新生產者試圖發送消息時,代理可能會出現「鎖定」的現象。

當達到系統內存限制時,代理也可能以奇怪的方式鎖定。檢查你的配置值:

<systemUsage> 
    <systemUsage> 
    <memoryUsage> 
     <memoryUsage limit="64 mb" /> 
    </memoryUsage> 
    <storeUsage> 
     <storeUsage limit="100 gb" /> 
    </storeUsage> 
    <tempUsage> 
     <tempUsage limit="10 gb" /> 
    </tempUsage> 
    </systemUsage> 
</systemUsage> 

識別這種問題的最簡單方法是使用JMX客戶端,如JConsole的,連接到經紀人,並檢查當前內存使用量相對於自己的極限,針對不同的目的地和整體經紀人。

+0

我添加了我的經紀人配置。流量控制錯誤,未達到系統使用限制。 – Laures 2012-02-02 14:25:49

0

由於您沒有顯示客戶端URI的樣子,因此不容易說出確切的問題。如果您在客戶端uri上使用故障轉移並且客戶端無法連接到代理,則可能會出現您描述的客戶端掛起。對createSession的調用基本上會觸發一個條件,導致客戶端與服務器交換協議命令,並且如果無法建立連接,則呼叫將阻塞,直到故障轉移傳輸可以創建連接。

+0

根據客戶端日誌記錄它確實連接到列表中的第一個代理的故障轉移日誌以及getConnection返回但不記錄該createSession返回的客戶端日誌。此外,當代理商失敗時,我們最後一次意識到創建的連接無法關閉。這也阻止了。 – Laures 2012-02-05 10:34:47