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会执行以下周期性任务:
- 执行容器中Cluster组件的周期性任务(集群管理有关
- 执行容器中Realm组件的周期性任务(安全管理有关
- 执行容器中valve组件的周期性任务
- 触发容器中“周期性事件”,Host容器的监听器HostConfig就靠它来调用
类似容器的生命周期事件:初始化、启动和停止。
Tomcat 热加载
基于ContainerBase的周期性任务处理框架,容器只要实现自己的周期性任务就可以被调用起来。比如Context容器中的backgroundProcess:
- webapploader周期性的检查WEB-INF/classes和WEB-INF/lib目录下的类文件
- session管理器周期性检查是否有过期的session
- 周期性的检查静态资源是否有变化
- 调用父类的ContainerBase的backgroundProcess
那webapploader是怎么实现热加载的?
主要调用了Context容器的reload方法:
- 停止和销毁Context容器及其所有子容器,子容器就是servlet,也就是Context容器中的Servlet实例也被销毁了。
- 停止和销毁Context容器关联的Listner和filter
- 停止和销毁Context下的Pipeline和各种Valve
- 停止和销毁Context的类加载器,以及类加载器加载的类文件资源。
- 启动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应用:
- 如果原来的web应用目录被删掉了,就把相应Context容器整个销毁掉
- 是否有新的web应用目录被放进来了,或者有新的WAR包放进来了,就部署相应的web应用
HostConfig做的事情比较宏观,它不会去检查具体的类文件或者资源文件是否有变化,而是检查web应用目录级别的变化。
总结
- 热加载的粒度比较小,主要是针对类文件的更新,通过创建新的类加载器来实现重新加载。
- 热部署是针对整个web应用,tomcat会将原来Context对象销毁,再重新创建新的Context对象
- Tomcat在基类ContainerBase中统一实现了后台线程的逻辑,在顶层容器Engine中启动后台线程,其他子容器不需要再额外创建后台线程也可以实现后台检测周期性任务的功能。
网友评论