一、需求
生产环境中,升级应用每次都要重启tomcat,每次都要问客户可以停机更新了没。
为了实现升级应用时,不重启tomcat,升级过程不影响业务,实现热升级。
二、tomcat官方文档说明
1、tomcat7.0.5 开始支持并行部署(其他博文找的)
2、tomcat7上下文容器(The Context Container)的官网说明地址(如果是tomcat8,把7改为8就可以了):https://tomcat.apache.org/tomcat-7.0-doc/config/context.html
关于并行部署的我觉得比较重要的有以下几点,以下截图是用谷歌翻译的
三、实现
1、准备工作
tomcat7.0.109、servlet工程
下载链接:https://pan.baidu.com/s/1owRpBYqNfsdH72KJMvq8vw 提取码:er6u
下载后servlet_demo\out\artifacts\servletTest\下已经生成版本1、2的war包,可直接使用:servletTest##001.war、servletTest##002.war
版本1代码
版本2代码
2、操作
①、将版本1war包(servletTest##001.war)添加到tomcat/webapps目录下,启动tomcat/bin/startup.bat,启动完成后,webapps下会生成servletTest##001文件夹
②、打开浏览器,输入http://localhost:8080/servletTest/,点击"有项目名称-提交版本1",控制台会打印"版本1post请求",把地址还原为http://localhost:8080/servletTest/,进行下一步操作
③、将版本2war包(servletTest##002.war)添加到tomcat/webapps目录下,tomcat检测到有新的war包时,会解压并部署
④、刷新刚刚打开的页面,并点击"有项目名称-提交版本1",出现的结果会跟第②步一样。
⑤、打开一个别的浏览器,并 输入http://localhost:8080/servletTest/ ,会发现页面改变了,点击"有项目名称-提交版本2",控制台会打印"版本2post请求"。这样就实现了多版本并行了。
⑥、如果server.xml中配置了undeployOldVersions="true",当所有旧版本会话都结束后,并不再使用时,tomcat会删除以这种方式部署的旧版本,即会删除webapps目录下的servletTest##001文件夹和servletTest##001.war。如果担心误删,可不添加undeployOldVersions="true"配置,但需要等旧版本都不使用时,手动删除。
⑦、以上是端口后面带项目名称的操作方式,有时候项目会出现不带项目名称的情况,这时候我们只要把servletTest##001.war的项目名称servletTest替换为ROOT即可,官方文档有说明。
四、其他小技巧
问题1:一定要用war包生成文件夹,然后tomcat自动部署吗?
答:可以把文件夹直接放到webapps下。
问题2:有些项目war包(非初始版本)放到webapps时,自动部署会报错,应该怎么解决?
答:可以尝试直接将编译后的文件夹放到webapps中。如果文件夹比较大时,最好把文件夹复制到webapps的同级目录下,再复制到webapps中。