問題:
最近發現Netty項目每次發布的時候Netty在重啟時都會報端口被
占用的異常, 需要過十幾秒左右手動重啟一遍, Netty才能恢復正常
目前猜測是由於Tomcat_restart的時候Netty執行相關的銷毀操作, Channel.close().awaitUninterrupted() 以及 bossGroup和workerGroup在關閉時socket沒有完全關閉, 也許是處於TIME-WAIT狀態, 導致Netty在重啟的時候報端口被
占用
解決:
Netty BootStrap有一個Option SO_REUSEADDR, 作用是重用處於TIME_WAIT但是未完全關閉的socket地址, 由於我在本地和dev上在有大量請求的情況下重啟也未發現有端口被
占用的情況, 只能在線上發布的時候才能測試出來, 正好線上發布的那個版本 ... 我忘記開 SO_REUSEADDR了... 所以, 只能下次再看是否有效果了
相關:
1) TCP四次揮手
TCP的socket連接在服務端單方面關閉連接時, 會進入如下四次揮手流程(圖片來源於網絡)

此時服務端socket如果處於TIME-WAIT狀態, 而又沒有開啟SO_REUSEADDR 則會出現端口被
占用異常
2) SO_REUSEADDR(摘自百科)
