转:http://blog.csdn.net/hejinwei_1987/article/details/49100975

在现在的项目中发现Quartz执行了两次,在网上找到下列解决方案,我是用的第一种,灰常感谢这位哥们,转自:http://my.oschina.net/EugeneQiu/blog/265040?p=1

很多人在使用spring的Quartz配置定时任务时,会发现每次定时时间到达后,指定的定时方法同时执行了两次。

(P.S. 本人项目用的Jfinal搭建,同样出现该问题。)

解决quartz定时任务被触发两次的问题:

其中<Host/>告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,<Context/>又让tomcat再加载了一遍(一般情况下配置<Context/>,主要是由于想域名访问时将工程名去掉的原因配置),这种情况下会导致工程中的quartz定时被两次触发,执行两次。

<Host/>里面的改成 autoDeploy="false" deployOnStartup="false" 这样就可以避免tomcat服务器中自启动导致quartz定时任务被触发两次。(当然还可以按需求修改,毕竟每个项目的需求都不尽相同。)

1. autodeploy属性值设置为false,如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用,设成false就不会。

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

这样的话,在tomcat启动时,不会自动发布appBase下的应用,启动后也不会自动发步appBase下的应用。

1
2
3
4
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="false" deployOnStartup="false">
    <Context path="" docBase="/eugeneqiu_test" debug="0" reloadable="true"/>
      </Host>

当然网络上也有另外一种配置方法:

就是在<Context/>里面修改 docBase加上“/webapps”路径,当然项目访问路径就变为http://localhost/eugeneqiu_test 了,看见项目名实在是难受,我就没用这方法了。

1
2
3
4
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="/webapps/eugeneqiu_test" debug="0" reloadable="true"/>
      </Host>

解决quartz定时任务被触发两次的问题

方法1、通过改TOMCAT的配置文件server.xml配置

方法2、先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml 然后修改web.xml,让web容器启动时,可以加载该文件 。(此文没对此方法进行深入探究)

附带:quartz的测试用例

java测试用例代码1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.eugeneqiu_test.test;
 
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
 
/**
 * 每5秒自动运行
 * @author EugeneQiu
 */
public class Every5s{
    public static void orderEveryhour(String[] args) throws SchedulerException {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
 
        JobDetail jobDetail = JobBuilder.newJob()
                .ofType(Test.class)
                .usingJobData("Test1","Quartz")
                .withIdentity("Test1","Group1")
                .build();//通过JobBuilder构建JobDetailImpl 实例,也可以直接new JobDetailImpl
 
        Trigger trigger = TriggerBuilder.newTrigger()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))  //还有更多时间格式,详情可以百度一下
                .forJob("Test1","Group1")       //Trigger找到对应的名称为Test1组为Group1的Job,如果不存在则会在执行scheduler.scheduleJob(jobDetail,trigger);报错
                .build();//通过TriggerBuilder构建CronTriggerImpl实例,也可以直接new CronTriggerImpl
 
        scheduler.scheduleJob(jobDetail,trigger);//任务每5秒触发一次
 
        scheduler.start();
    }
}
1
2
3
4
5
6
7
8
@Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
         
         System.out.println("Hello 要开始自动运行喽~~~~~~" );
         //testSomething(); //这里可以写一下想定时运行的方法
         System.out.println("Hello 自动运行结束~~~~~");
         
    }

第二种解决方案另外一位哥们写得更好些,如下转自:http://blog.csdn.net/tengdazhang770960436/article/details/46909845

最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此。
打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程。 
研究下来发现quartz确实会加载两次: 
第一次:web容器启动的时候,读取applicationContext.xml文件时,会加载一次。 
第二次:Spring本身会加载applicationContext.xml一次。 
而我的quartz配置就是写在applicationContext.xml文件里的。

解决办法很简单 
先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml 
然后修改web.xml,让web容器启动时,可以加载该文件

这样quartz只会在web容器启动时加载一次,Spring不会再加载了。 
 
web.xml配置如下:
 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml,/WEB-INF/classes/applicationContext-timertask.xml</param-value>
  </context-param>
  <!-- 开启监听 -->
  <listener>
      <listener-class>
          org.springframework.web.context.ContextLoaderListener
      </listener-class>
  </listener>
 
把定时器的配置单独写成一个配置文件,在web容器启动的时候只加载一次

例子:

quartz执行两遍问题的更多相关文章

  1. spring quartz执行两次问题

    解决quartz定时任务被触发两次的问题: 其中<Host/>告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,<Context/>又让tomcat再加载了 ...

  2. Tomcat配置错误导致Quartz执行两次问题

    以下基于tomcat服务器 我们通常将域名映射到指定服务器的端口上,以通过域名直接访问服务,如http://www.abc.com域名已绑定到本机的80端口,项目名wechat,则直接访问http:/ ...

  3. AOP中Advice执行两遍的原因

    在我的spring项目中,Aop的Advice执行了两边,就好像拦截了两遍一样. 原因是:切面应该切到接口的实现类上,而不是接口上

  4. 在taro中跳转页面的时候执行两遍componentDidMount周期的原因和解决方法

    在做taro跳转的时候,发现在跳转后的页面会走两遍componentDidMount周期,查看了github上的issues,发现是跳转路由带参为中文引起的,只要把中文参数进行urlencode解决 ...

  5. Run as ant build每次都执行两次-问题解决

    在Eclipse里面,运行ant,整个测试流程总是执行两遍,其几天试了下在DOS命令行直接调用ant, 结果发现只执行了一次,并且内存消耗好像也没那么大了,估计是eclipse自己的问题.问题解决了, ...

  6. Quartz每次调度时被执行两次

    [关键字:重复执行.重复调用.每次执行两次.执行2次] 前言: 先说一下,项目背景.由于组内某成员在用Maven搭建项目时不规范,导致项目的名称与实际访问项目名称不一致.在部署项目时,必需要配一下虚拟 ...

  7. 分析解决 spring quartz 中出现的执行两次问题

    1. 问题描述 在开发询盘功能时,遇到一个需求,就是后台定时任务执行用电施工业务的工单下发. 使用的技术是 spring quartz,因为其他应用有先例,配置quartz 完成后,先写了一个 hel ...

  8. spring定时器,定时器一次执行两次的问题

    Spring 定时器 方法一:注解形式 配置文件头加上如下: xmlns:task="http://www.springframework.org/schema/task" htt ...

  9. AngularJs中ng-controller下的函数在调用时为什么会执行两次?

    最近在学习AngularJs的过程中,自己做了个demo,但程序运行后却发现有个地方运行不对劲,纠结了半天,也问了,也查了,但是没有一个满意的答案,所以特地贴出来,请教各位大神(先说声谢谢了!).为了 ...

随机推荐

  1. SecureCRT问题

    使用SecureCRT 与虚拟机进行通信,提示The remote system refused the connection 解决:由于缺少SSH服务器端 sudo apt-get install ...

  2. http协议和四个层之间的关系

    TCP/IP协议的分层:应用层.传输层.网络层.数据链路层. ····应用层···· 决定了向用户提供应用服务时通信的活动.HTTP协议存在于该层.(FTP文件传输协议,DNS域名系统) ....传输 ...

  3. Aria2+WebUI,迅雷倒下之后的代替品

    Aria2+WebUI,迅雷倒下之后的代替品 (2017-07-24 12:56:28) 转载▼   分类: 软件 最近迅雷越来越作死了,砍第三方远程下载,强推迅雷9喂用户的屎,下载资源能砍就砍,以前 ...

  4. 20. pt-show-grants

    pt-show-grants -h 192.168.100.101 -P 3306 -u admin -p admin 也可以delete,revoke,flush privileges , 用的不多 ...

  5. web工程was部署

    web.xml调整: 新增如下servlet <servlet> <servlet-name>SimpleFileServlet</servlet-name> &l ...

  6. python基本数据类型之整型和浮点型

    python基本数据类型之数字与浮点型 在python3中,整数的数据类型为int,而浮点数的数据类型为float.python2中整数可以是int和long(长整型)两种类型,python3只保留了 ...

  7. 小程序快捷键(mac中)

    快捷键 格式调整  - Ctrl+S:保存文件  - Ctrl+[, Ctrl+]:代码行缩进  - Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块  - Ctrl+C Ctrl ...

  8. Beta冲刺 (7/7)

    Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1:(组长)柯奇豪 过去两天完成了哪些任务 部分代码的整合 编辑文章部分的完成 ...

  9. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  10. Statement与PreparedStatement的区别

    Statement与PreparedStatement的区别   PreparedStatement预编译SQL语句,性能好. PreparedStatement无序拼接SQL语句,编程更简单. Pr ...