不少人在使用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 自動運行結束~~~~~"); }