解決Quartz定時任務被觸發兩次的問題(附帶:Quartz的測試用例)

不少人在使用spring的Quartz配置定時任務時,會發現每次定時時間到達後,指定的定時方法同時執行了兩次。java

(P.S. 本人項目用的Jfinal搭建,一樣出現該問題。)web


 解決quartz定時任務被觸發兩次的問題:spring

其中<Host/>告訴tomcat,在啓動的時候加載webapps下的全部項目工程文件,<Context/>又讓tomcat再加載了一遍(通常狀況下配置<Context/>,主要是因爲想域名訪問時將工程名去掉的緣由配置),這種狀況下會致使工程中的quartz定時被兩次觸發,執行兩次。tomcat


  <Host/>裏面的改爲 autoDeploy="false" deployOnStartup="false" 這樣就能夠避免tomcat服務器中自啓動致使quartz定時任務被觸發兩次。(固然還能夠按需求修改,畢竟每一個項目的需求都不盡相同。)服務器

    1. autodeploy屬性值設置爲false,若是此項設爲true,表示Tomcat服務處於運行狀態時,可以監測appBase下的文件,若是有新有web應用加入進來,會自運發佈這個WEB應用,設成false就不會。網絡

    2.增長deployOnStartup="false",表示Tomcat服務器啓動時, 不會自動發佈appBase目錄下全部的Web應用。app

    這樣的話,在tomcat啓動時,不會自動發佈appBase下的應用,啓動後也不會自動發步appBase下的應用。webapp

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

  

固然網絡上也有另一種配置方法:ide

 就是在<Context/>裏面修改 docBase加上「/webapps」路徑,固然項目訪問路徑就變爲http://localhost/eugeneqiu_test 了,看見項目名實在是難受,我就沒用這方法了。測試

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


解決quartz定時任務被觸發兩次的問題

方法一、經過改TOMCAT的配置文件server.xml配置

方法二、先把quartz配置信息提取出來,單獨存成一個文件,好比applicationContext-quartz.xml 而後修改web.xml,讓web容器啓動時,能夠加載該文件 。(此文沒對此方法進行深刻探究)


附帶:quartz的測試用例

java測試用例代碼1:

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();
    }
}


@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		
		 System.out.println("Hello 要開始自動運行嘍~~~~~~" );
		 //testSomething(); //這裏能夠寫一下想定時運行的方法
		 System.out.println("Hello 自動運行結束~~~~~");
		
	}
相關文章
相關標籤/搜索