問題:
最近發現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鏈接在服務端單方面關閉鏈接時, 會進入以下四次揮手流程(圖片來源於網絡)
![](http://static.javashuo.com/static/loading.gif)
此時服務端socket若是處於TIME-WAIT狀態, 而又沒有開啓SO_REUSEADDR 則會出現端口被
佔用異常
2) SO_REUSEADDR(摘自百科)
這個
套接字
選項通知內核,若是端口忙,但TCP狀態位於 TIME_WAIT ,能夠重用端口。若是端口忙,而TCP狀態位於其餘狀態,重用端口時依舊獲得一個錯誤信息,指明"地址已經使用中"。若是你的服務程序中止後想當即重啓,而新
套接字
依舊使用同一端口,此時 SO_REUSEADDR 選項很是有用。必須意識到,此時任何非指望數據到達,均可能致使服務程序反應混亂,不過這只是一種可能,事實上很不可能