通过分析 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() 方法监听停止服务请求的方法
- stop() 方法是停止服务的方法
await() 方法是阻塞方法,只有客户端请求关闭tomcat服务时,他才会执行stop() 方法,否则一直等待关闭请求。
StandardServer 类 await 方法
通过源码,可以看出,这里开启了一个ServerSocket,端口是Server.xml 中配置的 shutdown 端口。
然后调用socket.accept() 方法监听停止tomcat服务的请求。
这里的address默认是"localhost",也就是只监听ip是localhost上的关闭请求。
如果想支持远程关闭,可以这样配置:
<Server port="8085" shutdown="SHUTDOWN" address="192.168.3.249">
如果有请求,则接受请求,并判断请求的内容是不是 “SHUTDOWN” 字符串。
如果是 “SHUTDOWN”,则跳出循环,并停止该 Socket 服务。然后在调用停止 Tomcat 服务方法。
Catalina 类 stop() 方法
停止服务代码如下 :
想了解更多精彩内容请关注我的公众号