Tomcat 怎么停止服务的?

通过分析 Tomcat catalina.bat 原理解析时,发现启动tomcat和关闭tomcat都是调用 MAINCLASS 启动类进行操作的。

Tomcat 怎么停止服务的?_第1张图片
Catalina.bat

这里有个疑问,既然都是通过调用 MAINCLASS 类进行操作的,那就是启动tomcat服务是一个进程、关闭tomcat服务应该是另一个进程。

那么如果是多个进程,是怎么互相操作的呢?带着疑问我们分析下tomcat的源码。

客户端操作(shutdown操作)

Bootstrap 类 main 方法

Tomcat 怎么停止服务的?_第2张图片
Bootstrap类main方法

这里会调用stopServer() 方法

Bootstrap 类 stopServer() 方法

Tomcat 怎么停止服务的?_第3张图片
Bootstrap 类 stopServer 方法

这里通过反射会调用 Calalina.java 中的 stopServer 方法

Calalina 类 stopServer() 方法

Tomcat 怎么停止服务的?_第4张图片
Calalina 类 stopServer 方法

从该方法中我们发现,它是通过 socket 连接 要关闭的 tomcat 服务器,只发送一个 “SHUTDOWN” 字符串操作,就执行结束了。

Socket的ip和端口

SHUTDOWN 的默认ip是localhost,端口是通过tomcat\conf\server.xml中配置的,如下:


tomcat/conf/server.xml

服务端操作(运行中的tomcat)

Catalina类 start 方法

Catalina.java 类中start方法中调用了两个方法如下:


Tomcat 怎么停止服务的?_第5张图片
Catalina 类 start 方法
  1. await() 方法监听停止服务请求的方法
  2. stop() 方法是停止服务的方法

await() 方法是阻塞方法,只有客户端请求关闭tomcat服务时,他才会执行stop() 方法,否则一直等待关闭请求。

StandardServer 类 await 方法

Tomcat 怎么停止服务的?_第6张图片
StandardServer 类 await

通过源码,可以看出,这里开启了一个ServerSocket,端口是Server.xml 中配置的 shutdown 端口。
然后调用socket.accept() 方法监听停止tomcat服务的请求。

这里的address默认是"localhost",也就是只监听ip是localhost上的关闭请求。
如果想支持远程关闭,可以这样配置:


Tomcat 怎么停止服务的?_第7张图片
Paste_Image.png

如果有请求,则接受请求,并判断请求的内容是不是 “SHUTDOWN” 字符串。
如果是 “SHUTDOWN”,则跳出循环,并停止该 Socket 服务。然后在调用停止 Tomcat 服务方法。

Catalina 类 stop() 方法

停止服务代码如下 :


Tomcat 怎么停止服务的?_第8张图片
Paste_Image.png

想了解更多精彩内容请关注我的公众号

你可能感兴趣的:(Tomcat 怎么停止服务的?)