Tomcat的停止入口为:

  1. // 是否需要阻塞,await标记是在通过Bootstrap类启动时设置为true的
  2. if (await) {
  3. await(); // 使用ServerSocket来监听shutdown命令来阻塞
  4. stop(); // 如果阻塞被解开,那么开始停止流程
  5. }

Catalina.stop

  1. 移除ShutdownHook
  2. 如果已经在停止过程中,则不进行任何操作
  3. 停止StandardServer
  4. 摧毁StandardServer

StandardServer.stopInternal

  1. 触发CONFIGURE_STOP_EVENT事件
  2. 停止StandardService
  3. 关闭接收shutdown命令的ServerSocket

StandardServer.destroyInternal

  1. 摧毁StandardService
  2. 注销被注册到JMX中的MBeanFactory与StringCache

StandardService.stopInternal

  1. 暂停Connector,暂停Endpoint,无法接收新请求
  2. 停止Container
  3. 停止Connector

JioEndpoint.pause

  1. 设置paused=true
  2. 解锁Accept,应用JioEndpoint中是通过Acceptor来接收请求的,是以阻塞的方式来接收请求的,所以如果要停止JioEndpoint的话,需要主动发送一个请求来解阻塞。

ContainerBase.stopInternal

  1. 停止容器的background线程
  2. 停止pipeline
  3. 利用线程池停止子容器
  4. 停止DirContext
  5. 停止Realm
  6. 停止Cluster
  7. 停止Manager
  8. 停止Loader

Connector.stopInternal

  1. 停止JioEndpoint
  2. 停止MapperListener


JioEndpoint.pause

  1. 释放连接数限制
  2. 如果没有暂停就先暂停,设置running为false
  3. 解阻塞Accpet
  4. 停止线程池