天天看点

Java Web项目 quartz定时器执行两次原因与解决方法

        这几个月发生了很多事情,一直没空更新博客,刚好趁着这个月换了一个工作, 新公司打算做重构,做重构之前项目经理给了一个定时器的项目,让增加个功能,该项目属于一个比较老的项目了,需要把项目部署到外置容器中才能运行访问,由于许久没有接触过这种项目所以最近也踩了不少坑,今天就遇到了一个很诡异的问题-----quartz定时任务在本地运行正常 但是部署到linux服务器[我们还是放置到tomcat中]上就总是同一个任务在同一个时间总是执行两次的问题.

先看下server.xml文件中的配置

Java Web项目 quartz定时器执行两次原因与解决方法

其中Host告诉tomcat在启动时候去加载webapps目录下的所有项目文件,而<context>又让tomcat加载了一遍[配置context的目的是在访问项目时不带上工程名],这样就造成了工程中的quartz被加载两次,执行两次.

解决方法: 将appBase设置为空即可,但是docBase一定要设置完整路径<Context docBase="/home/apache-tomcat-9.0.12/webapps/upTask".....

这种方法也是我试了很多种方案之后亲测有效的方案, 之前在网上也搜了很多种解决方法比如: 将<Host>中的 autoDeploy="false" 与 deployOnStartup="false" 均设置为false, 抑或者将 appBase设置为空,但是docBase没有设置成全路径 等等这些方法在我这都不奏效, 甚至网上还有将quartz相关的参数抽取成一个xml文件,直接在web.xml中加载该文件,由于我本地quartz的参数是properties类型的文件,改成xm略麻烦,再加上本人喜欢用简单粗暴省事的方案解决问题,所以这种方案没作尝试,有兴趣的小伙伴可以尝试一下,完事告诉我一下结果,哈哈...