quartz执行两遍问题

转: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容器启动的时候只加载一次

例子:

时间: 2024-08-15 15:47:41

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

spring quartz执行两次问题

解决quartz定时任务被触发两次的问题: 其中<Host/>告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,<Context/>又让tomcat再加载了一遍(一般情况下配置<Context/>,主要是由于想域名访问时将工程名去掉的原因配置),这种情况下会导致工程中的quartz定时被两次触发,执行两次. <Host/>里面的改成 autoDeploy="false" deployOnStartup="fa

ASP.NET Page_Load执行两次

早上在写一个.NET的计数器程序,发现每次刷新页面,计数器就加2,屏蔽一切可能导致这种情况的代码,问题依旧,苦闷了一个上午!后来在好友的协助下发现Page_Load这个方法执行了两次,上网搜索相关的问题,发现遇到该问题的还真不少! 诸如加入AutoEventWireup="false"等方法简直是胡扯,因为一旦创建一个aspx页面,这行代码便会自动加入.后来找出一篇<img src="">会导致Page_load执行两遍的文章,恍然大悟,马上将iis的默

Quartz每次调度时被执行两次

[关键字:重复执行.重复调用.每次执行两次.执行2次] 前言: 先说一下,项目背景.由于组内某成员在用Maven搭建项目时不规范,导致项目的名称与实际访问项目名称不一致.在部署项目时,必需要配一下虚拟路径,映射到那个项目所在目录下去,才能正常访问.举个例子:项目名称叫student-web,部署到Tomcat-webapps下,本地环境正常情况下的访问url应该是: 127.0.0.1:8080/student-web 而实际访问的url需要这样: 127.0.0.1:8080/student

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

1. 问题描述 在开发询盘功能时,遇到一个需求,就是后台定时任务执行用电施工业务的工单下发. 使用的技术是 spring quartz,因为其他应用有先例,配置quartz 完成后,先写了一个 helloworld 测试下. 然而却发现,每次到定时时间后,程序都会执行两次. 2. 分析过程 先使用 bing 搜索了下看别人是否也遇到过类似问题,果然有. http://blog.csdn.net/jiang117/article/details/43077275 上面文档的作者,查找的原因是 Co

spring 定时器执行两次

spring错误笔记 spring定时器执行两次因为导入了两次 关于配置文件如下 <bean id="timeTaskService" class="xx.xxx.xxx.xxx.service.impl.na.TimeTaskService"/> <task:scheduled-tasks scheduler="myScheduler"><!--30秒执行一次 --> <task:scheduled r

针对jquery绑定click事件执行两次,layer弹出框,以及img的map属性应用。

前不久使用jQuery与layer实现一个弹出框,发现在绑定弹出框事件时,事件执行了两次,准确的说是方法同时注册了两次,不分先后执行了两遍,导致弹出框弹出两次.请教同事后,发现原因有可能是jQuery的js与layer的js冲突(具体原因还需要深入了解),通过网络和请教同事,得到了三种处理方法. 方法一:不采用jQuery进行事件的绑定,直接在标签中添加onclick事件. 方法二:采用这种方式$("#item_add_button")[0].onclick = function(){

Spring @Scheduled 服务器上定时任务执行两次

昨天写了一个定时任务,每五分钟执行一次. 通过日志观察总是执行两次,并且是两个线程执行的.刚开始以为是spring加载了两遍. 包括网上说web.xml 和spring 各加载了一遍,导致最后执行两次. 最后排查原来是tomcat配置问题 这是之前的配置 . 这是之后的配置. 修改后,只执行一次.

spring framework web @Scheduled 执行两次的问题

与本文相关的关键词:Spring @Scheduled 执行两次的问题 使用组件:Spring framework web mvc 现象如下:使用@Scheduled标注的方法会执行两次 通过google输入关键词:spring @scheduled called twice,会显示许多人遇到相似问题. 该问题的根本原因就是包含有@Scheduled方法的类被初始化两次. 在spring官方说明中有如下提示: Make sure that you are not initializing mul

jquery validate组件导致表单onsubmit事件执行两次

这是今天在工作中遇到的一个问题.由于业务需要在原来表单提交时增加一段新的校验逻辑. 原来的逻辑如下(代码都做了简化): 在表单提交时,使用check方法校验 <form onsubmit= "return check();"> 方法代码: function check(){ if(...){ alert("xxx"); return false; } } 因为新增了一段逻辑,所以我新增了一个方法,调整了代码的结构: < form onsubmit=