2013-02-05 41 views
1

我對如何處理netty(3.6.2.FINAL)和keep-alive = true中的大量連接感到困惑。netty client + keep-alive = true

對於在netty客戶機上作爲服務器端連接器工作,要對其他服務進行http調用,它希望始終保持連接打開以保持性能(keep-alive = true)。

問題:打開通道的數量存在硬性限制,在嘗試打開通道後客戶端將掛起。爲什麼沒有例外只是掛起?這是通道超時設置嗎?

我似乎無法工作線程內瞭解的Netty在連接的整體管理方面:

  • 與封閉的讀/寫客戶端的ChannelHandler(HTTP請求/響應),你怎麼檢測連接池是空的?

  • 處理程序可以接收ChannelEvent,但沒有任何關於連接池中可用的總計數(無論如何非常不確定)。如果頻道沒有打開,那麼處理程序是否有理由開始打開一個新的頻道,因爲它在工作線程中運行?

  • 但是,如果連接池耗盡,你將如何去清理一些空閒連接(在處理程序中)?

回答

0

我不得不徹底撕開我的處理程序,讓客戶端阻止呼叫在沒有掛起的情況下工作。這個問題主要通過在處理程序中不保持本地通道引用來解決。

現在我們只需將ConnectionInterface#openConnection()[返回一個新的ChannelFuture]傳遞給共享自定義ChannelHandler#調用(ConnectionInterface connectionInterface,HttpRequest請求)即可。

更好地在處理程序調用方法中打開通道,並在channel.write(x)之前傳遞該通道並檢查其狀態,如果!channel.isWritable()然後回收該通道(從新客戶端連接例如ConnectionInterface#openConnection())並重試寫入。甚至不需要關閉頻道(它可以在游泳池中處理)。

剛剛運行500線程/ 5000請求,它成功罰款。