tomcat-1

2021-08-27  本文已影响0人  甜甜起司猫_

tomcat-1

tomcat 热部署和热加载

热部署和热加载可以在运行过程中不重启系统升级WEB应用。

热加载

实现方式是web容器启动一个后台线程,定期检测类文件的变化,如果有变化,就重新加载类,在这个过程中不会清空session,一般用在开发环境。

热部署

也是由后台线程定时检测WEB应用的变化,但它会重新加载整个WEB应用。这种方式会清空session,比热加载更加干净、彻底,一般用在生产环境。

tomcat 后台线程

tomcat使用scheduledThreadPoolExecutor来开启后台线程。scheduledThreadPoolExecutor一般用于执行后台周期性任务,还具备线程池功能。

bgFuture=exec.scheduleWithFixedDelay(new ContainerBackgroundProcessor(),backgroundProcessorDelay,backgroundProcessorDelay,TimeUnit.SECONDS);

其中,ContainerBackgroundProcessor()方法中的processChildren方法中,除了调用当前容器的backgroundProcess方法,还会递归调用子容器的backgroundProcess方法。而backgroundProcess方法是Container接口中的方法,所以当Engine容器中启动这个后台线程,这个后台线程不但会执行Engine容器中的周期性任务,还会执行所有子容器的周期性任务。

backgroundProcess

基类ContainerBase中backgroundProcess会执行以下周期性任务:

  1. 执行容器中Cluster组件的周期性任务(集群管理有关
  2. 执行容器中Realm组件的周期性任务(安全管理有关
  3. 执行容器中valve组件的周期性任务
  4. 触发容器中“周期性事件”,Host容器的监听器HostConfig就靠它来调用

类似容器的生命周期事件:初始化、启动和停止。

Tomcat 热加载

基于ContainerBase的周期性任务处理框架,容器只要实现自己的周期性任务就可以被调用起来。比如Context容器中的backgroundProcess:

  1. webapploader周期性的检查WEB-INF/classes和WEB-INF/lib目录下的类文件
  2. session管理器周期性检查是否有过期的session
  3. 周期性的检查静态资源是否有变化
  4. 调用父类的ContainerBase的backgroundProcess

那webapploader是怎么实现热加载的?

主要调用了Context容器的reload方法:

  1. 停止和销毁Context容器及其所有子容器,子容器就是servlet,也就是Context容器中的Servlet实例也被销毁了。
  2. 停止和销毁Context容器关联的Listner和filter
  3. 停止和销毁Context下的Pipeline和各种Valve
  4. 停止和销毁Context的类加载器,以及类加载器加载的类文件资源。
  5. 启动Context容器,在这个过程中会重新创建前面4步被销毁的资源。

注意,Context的reload方法里没有调用Session的destory方法,也就是说Context关联的Session是没有被销毁的。
一般来说,tomcat的热加载默认是关闭的,通过reloadable配置打开。

Tomcat热部署

热部署和热加载的关键区别是热部署会重新部署Web应用,原来的Context对象被会销毁,因此与Context关联的一切资源也会被销毁,包括Session。

Context被销毁了,那热部署就由Context的父容器Host来实现了。

跟Context不一样,Host容器不是通过backgroundProcess实现周期性检测任务,而是通过监听器HostConfig来实现。HostConfig也是前面说到周期性任务的其中一步。

hostConfig

hostConfig就观察webapps目录下的所有web应用:

  1. 如果原来的web应用目录被删掉了,就把相应Context容器整个销毁掉
  2. 是否有新的web应用目录被放进来了,或者有新的WAR包放进来了,就部署相应的web应用

HostConfig做的事情比较宏观,它不会去检查具体的类文件或者资源文件是否有变化,而是检查web应用目录级别的变化。

总结

上一篇下一篇

猜你喜欢

热点阅读