Tomcat的停止入口为:
// 是否需要阻塞,await标记是在通过Bootstrap类启动时设置为true的
if (await) {
await(); // 使用ServerSocket来监听shutdown命令来阻塞
stop(); // 如果阻塞被解开,那么开始停止流程
}
Catalina.stop
- 移除ShutdownHook
- 如果已经在停止过程中,则不进行任何操作
- 停止StandardServer
- 摧毁StandardServer
StandardServer.stopInternal
- 触发CONFIGURE_STOP_EVENT事件
- 停止StandardService
- 关闭接收shutdown命令的ServerSocket
StandardServer.destroyInternal
- 摧毁StandardService
- 注销被注册到JMX中的MBeanFactory与StringCache
StandardService.stopInternal
- 暂停Connector,暂停Endpoint,无法接收新请求
- 停止Container
- 停止Connector
JioEndpoint.pause
- 设置paused=true
- 解锁Accept,应用JioEndpoint中是通过Acceptor来接收请求的,是以阻塞的方式来接收请求的,所以如果要停止JioEndpoint的话,需要主动发送一个请求来解阻塞。
ContainerBase.stopInternal
- 停止容器的background线程
- 停止pipeline
- 利用线程池停止子容器
- 停止DirContext
- 停止Realm
- 停止Cluster
- 停止Manager
- 停止Loader
Connector.stopInternal
- 停止JioEndpoint
- 停止MapperListener
JioEndpoint.pause
- 释放连接数限制
- 如果没有暂停就先暂停,设置running为false
- 解阻塞Accpet
- 停止线程池