首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Tomcat 怎么停止服务的?

Tomcat 怎么停止服务的?

作者头像
java404
发布于 2018-05-18 12:28:04
发布于 2018-05-18 12:28:04
6.1K0
举报
文章被收录于专栏:java 成神之路java 成神之路

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

Catalina.bat

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

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

客户端操作(shutdown操作)

Bootstrap 类 main 方法

Bootstrap类main方法

这里会调用stopServer() 方法

Bootstrap 类 stopServer() 方法

Bootstrap 类 stopServer 方法

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

Calalina 类 stopServer() 方法

Calalina 类 stopServer 方法

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

Socket的ip和端口

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

tomcat/conf/server.xml

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

Catalina类 start 方法

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

Catalina 类 start 方法

  1. await() 方法监听停止服务请求的方法
  2. stop() 方法是停止服务的方法

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

StandardServer 类 await 方法

StandardServer 类 await

通过源码,可以看出,这里开启了一个ServerSocket,端口是Server.xml 中配置的 shutdown 端口。

然后调用socket.accept() 方法监听停止tomcat服务的请求。

这里的address默认是"localhost",也就是只监听ip是localhost上的关闭请求。

如果想支持远程关闭,可以这样配置:

代码语言:javascript
复制
<Server port="8085" shutdown="SHUTDOWN" address="192.168.3.249">

Paste_Image.png

如果有请求,则接受请求,并判断请求的内容是不是 “SHUTDOWN” 字符串。

如果是 “SHUTDOWN”,则跳出循环,并停止该 Socket 服务。然后在调用停止 Tomcat 服务方法。

Catalina 类 stop() 方法

停止服务代码如下 :

Paste_Image.png


​

​

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 客户端操作(shutdown操作)
    • Bootstrap 类 main 方法
    • Bootstrap 类 stopServer() 方法
    • Calalina 类 stopServer() 方法
    • Socket的ip和端口
  • 服务端操作(运行中的tomcat)
    • Catalina类 start 方法
    • StandardServer 类 await 方法
    • Catalina 类 stop() 方法
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档