Tomcat 怎么停止服务的?
通過分析 Tomcat catalina.bat 原理解析時,發現啟動tomcat和關閉tomcat都是調用 MAINCLASS 啟動類進行操作的。
這里有個疑問,既然都是通過調用 MAINCLASS 類進行操作的,那就是啟動tomcat服務是一個進程、關閉tomcat服務應該是另一個進程。
那么如果是多個進程,是怎么互相操作的呢?帶著疑問我們分析下tomcat的源碼。
客戶端操作(shutdown操作)
Bootstrap 類 main 方法
這里會調用stopServer() 方法
Bootstrap 類 stopServer() 方法
這里通過反射會調用 Calalina.java 中的 stopServer 方法
Calalina 類 stopServer() 方法
從該方法中我們發現,它是通過 socket 連接 要關閉的 tomcat 服務器,只發送一個 “SHUTDOWN” 字符串操作,就執行結束了。
Socket的ip和端口
SHUTDOWN 的默認ip是localhost,端口是通過tomcat\conf\server.xml中配置的,如下:
服務端操作(運行中的tomcat)
Catalina類 start 方法
Catalina.java 類中start方法中調用了兩個方法如下:
await() 方法是阻塞方法,只有客戶端請求關閉tomcat服務時,他才會執行stop() 方法,否則一直等待關閉請求。
StandardServer 類 await 方法
通過源碼,可以看出,這里開啟了一個ServerSocket,端口是Server.xml 中配置的 shutdown 端口。
然后調用socket.accept() 方法監聽停止tomcat服務的請求。
**這里的address默認是”localhost”,也就是只監聽ip是localhost上的關閉請求。
如果想支持遠程關閉,可以這樣配置:**
如果有請求,則接受請求,并判斷請求的內容是不是 “SHUTDOWN” 字符串。
如果是 “SHUTDOWN”,則跳出循環,并停止該 Socket 服務。然后在調用停止 Tomcat 服務方法。
Catalina 類 stop() 方法
停止服務代碼如下 :
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的Tomcat 怎么停止服务的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 使用 endorsed 覆盖j
- 下一篇: java.util.Random 实现原