簡體   English   中英

Netty服務器掛起不接受任何連接

[英]Netty server hangs not accepting any connection

我們開發了一個基於Netty(3.5.11)的IM服務器,它使用我們的自定義協議。

以下是處理程序添加到管道的順序。

objChannelPipeline.addLast("nettyLoggingHandler", objFrameworkLoggingHandler);
objChannelPipeline.addLast("ipFilter", objCustomIPFilterHandler);
objChannelPipeline.addLast("idleHandler", objIdleStateHandler);
objChannelPipeline.addLast("loggingHandler", objLoggingHandler);
objChannelPipeline.addLast("frameDecoder",objDelimiterBasedFrameDecoder);
objChannelPipeline.addLast("messageDecoder", new CustomProtocolDecoderHandler());
objChannelPipeline.addLast("groupOrder", executionHandler);
objChannelPipeline.addLast("ProtocolMultiplexer", objRegistrationHandler);

在我們從客戶端獲得的寄存器消息中找到協議之后,“ProtocolMultiPlexer”處理程序被替換為合適的“ProtocolHandler”。

ipFilterHandler查看MYSQL數據庫中的一個表,該表包含列入黑名單的IP,並決定是否要處理來自遠程IP的連接。

問題:每隔幾天后,服務器就會停止處理任何消息。 我們可以通過執行負載測試並終止與mysql服務器的所有連接來重新創建此問題。當所有MYSQL進程被殺死時,除了boss線程之外的所有netty線程似乎都掛起了。 服務器正在接受連接請求,但是進一步處理沒有發生的消息。 當我們發現我們沒有添加MYSQL“connectTimeout”和“socketTimeout”值時,我們認為問題已經解決了。 添加這些值之后我們再次嘗試通過在加載時殺死所有MYSQL進程來重復我們的測試,我們沒有發現任何線程進入掛起狀態。

在生產中使用上述更改部署服務器之后,我們遇到了類似的錯誤,但這一次,即使老板線程與所有其他“Netty”線程一起進入掛起狀態。 唯一正在運行的線程是來自我們的DBPool( http://www.snaq.net/java/DBPool/ )的更干凈的線程。 沒有Netty線程記錄任何內容,所有線程似乎都掛起了。 我無法獲得線程轉儲。 任何幫助都很明顯

謝謝

Netty處理程序不應該執行長時間的阻塞操作,例如從數據庫讀取。 從單獨的線程中進行,如http://netty.io/4.0/guide/#faq.4中提出的那樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM