2014-10-07 67 views
0

我有一個java程序,200個併發使用者從獨立的HornetQ服務器提供的隊列中讀取數據。監聽者只需從隊列中選取一個項目,隨機等待1.5到2.5秒,然後確認回隊列(它是CLIENT_ACKNOWLEDGE)。HornetQ消費者在關閉連接後需要很長時間才能停止

現在我在隊列中創建20.000條消息,啓動這200位消費者,並在5秒後在連接上調用close(嘗試停止)方法。這時消費者將處理大約1000條消息。但是,除了完成當前的工作並且不再接收隊列,他們還需要3分鐘才能處理另一個大約10.000條消息,然後終止並終止應用程序(connection.close()是阻塞調用)。

我懷疑這可能是由於在客戶端某種緩衝的,我一直在尋找各種方法來限制它,並在出廠配置中設立這四個屬性,以儘可能嚴格:

<producer-window-size>1</producer-window-size> 
<consumer-window-size>0</consumer-window-size> 
<consumer-max-rate>1</consumer-max-rate> 
<producer-max-rate>1</producer-max-rate> 

我知道我不一定需要所有這些爲我的情況,但只是想嘗試一切。我知道這些正在註冊,因爲一旦將消費者窗口大小設置爲零,我已經解決了消息順序的另一個問題。

+0

什麼是版本? – 2014-10-07 13:33:31

+0

它的版本是2.2.14 – 2014-10-07 13:40:51

回答

0

我們已經改變了我們的代碼中斷通信上游按照這些提交這裏:

HornetQ的-1379 & https://bugzilla.redhat.com/show_bug.cgi?id=1125042 - 強制客戶端出來的時候,服務器被卡在交付了OIO

的承諾可能會你是什​​麼改變了一個想法:

https://github.com/hornetq/hornetq/commit/4c05475

基本上我們forceClose的網狀連接上現在當時的連接是關閉在關閉連接時應該中斷與任何常用消費者的溝通。

我不認爲這個提交是在2.2分支上完成的。

+0

非常感謝您的回覆。我已經安裝hornetq-2.4.0.Final(使用獨立的,非集羣的),並在我的客戶端應用程序中將hornetq-core-client和hornetq-jms-client更改爲2.4.4.Final(和netty 3.2.9 .Final,jnp-client 4.2.2.GA)。不幸的是,問題仍然存在,[QueueConnection] .close()調用塊幾分鐘。 – 2014-10-09 11:29:07

+0

當我將消費者數量限制爲10時,它在大約10秒內完成得更快,每個線程從請求連接關閉的那一刻開始收集3-4條消息。它實際上與200名消費者的時間相當,10秒x20是200名消費者完成3分鐘所需的時間。有沒有可能減少這種情況? – 2014-10-09 11:35:57

+0

2.4.0沒有我們需要的改變...你能從git構建2.4.x並試用嗎?如果仍然存在,我們需要一個測試用例 – 2014-10-10 13:22:56

相關問題