SSH:解决Spring整合quartz定时任务执行两次问题

时间:2021-07-13 07:49:16

一.问题描述:


开发环境是Windows,测试环境是Linux,正式环境是Linux。

同样的代码,定时任务在在开发环境、测试环境中测试的定时任务只执行一次,而在正式环境执行2次。

各环境不同的是数据库的连接,以及正式环境的域名配置。


因为所开发项目图片等一些目录路径问题,所以在生产环境上配置了Tomcat/conf/server.xml  <Context


数据库不会影响定时任务执行2次,因此影响定时任务执行两次的只能是添加的<Context



二.解决方法:


五种解决办法:


1.将<Host/>里面的改成 autoDeploy="false" deployOnStartup="false" 这样就可以避免tomcat服务器中自启动导致quartz定时任务被触发两次。(当然还可以按需求修
改,毕竟每个项目的需求都不尽相同)如:<Host appBase="webapps" autoDeploy="false" deployOnStartup="false" name="localhost" unpackWARs="true">
(1)autodeploy属性值设置为false,如果此项为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新web应用加入进来,会自动发布这个 WEB应用,设成false就不会。


(2)增加deployOnStartup="false",表示Tomcat服务器启动时,不会自动发布appBase目录下所有的Web应用


2.如果项目tomcat下只有一个项目的话可以推荐用方法1;但是因为我的tomcat下有其他的项目,所以以上两个没用;【推荐】

quartz写在applicationContext.xml中,解决方法为将quartz的配置单独写个配置文件applicationContext-quartz;然后在web.xml中
 <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml,classpath:applicationContext-quartz.xl</param-value>
    </context-param>
 
3.将路径已出webapp目录,在docBase中指定路径(可以是相对于webapp的路径,或者绝对路径)【推荐】

4.替换ROOT目录【推荐】--当tomcat下就一个项目时推荐


5.在conf/Catalina/localhost生成ROOT.xml,并加入如下内容:

1 <?xml version='1.0' encoding='utf-8'?>
2 <Context docBase="xxx" path="" reloadable="true" />