Tomcat 怎么停止服务的?

通过分析 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上的关闭请求。
如果想支持远程关闭,可以这样配置:**

<Server port="8085" shutdown="SHUTDOWN" address="192.168.3.249">

Paste_Image.png

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

Catalina 类 stop() 方法

停止服务代码如下 :
Paste_Image.png

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值