原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/html
下載地址:http://quartz-scheduler.org/downloadsjava
Quartz Scheduler 是一個功能豐富,開源了的任務調度庫,能夠集成在幾乎任何java應用程序(從最小的獨立的應用程序到最大的電子商務系統)
Quartz以用來建立簡單或複雜的計劃表來執行數十,數百,或者成千上萬個任務,這些任務被定義爲標準的java組件,能夠執行幾乎任何你想讓他們作的事,Quartz Scheduler包含不少企業級功能,例如支持JTA事務,集羣等!數據庫
若是你的應用有任務須要在給定的時間準時執行,或者你的系統有按期的維護工做,那麼Quartz就是你的理想解決方案。apache
使用Quartz進行任務調度的實例:後端
租車過程:有人租車下了一個新的訂單,安排2小時後用,到時,將系統將先肯定訂單狀態,若是該訂單還沒收到過確認消息,則向他發出警告消息,並將訂單狀態改成等待干預。服務器
系統維護:安排一個工做,每一個工做日(節假日除外的全部平日)的11:30將數據庫的內容放到一個XML文件中。app
在應用中提供提醒服務。負載均衡
當一個給定的觸發器(Trigger)觸發時,任務(Job)將執行。觸發器能夠被下列指令的任何組合所建立:框架
任務(Job)能夠被命名並被放置於一個組(Group)中,觸發器(Trigger)也能夠被命名並被放入一個組(Group)中,這樣能夠在調度器(scheduler)中很好的的組織安排它們。
一個任務(Job)只能被調度器(scheduler)添加一次,可是能夠註冊在多個觸發器(Trigger)中。
在企業級的Java環境中,任務(Job)能夠做爲分佈式事務的一部分執行它們的工做分佈式
一個簡單的 quartz.properties 文件
org.quartz.scheduler.instanceName = MyScheduler //Scheduler 名字 org.quartz.threadPool.threadCount = 3 //線程池大小,最多3個Job同時執行 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore //數據存儲方式
一個簡單的開始關閉的實例
HelloJob.java
import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; /** * Created by zj.fan on 2016/3/1. */ public class HelloJob implements Job { public static final Logger _log = LoggerFactory.getLogger(HelloJob.class); public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { _log.info("Hello World! - " + new Date() + "-" + jobExecutionContext.getJobDetail().getJobDataMap().get("key1")); } }
SimpleExample.java
import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; /** * This Example will demonstrate how to start and shutdown the Quartz scheduler and how to schedule a job to run in * Quartz. * * @author Bill Kratzer */ public class SimpleExample { public static final Logger log = LoggerFactory.getLogger(SimpleExample.class); public void run() throws Exception { log.info("------- Initializing ----------------------"); // First we must get a reference to a scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); // computer a time that is on the next round minute Date runTime = DateBuilder.evenMinuteDate(new Date()); log.info("------- Scheduling Job -------------------"); // define the job and tie it to our example1.HelloJob class JobDataMap dataMap = new JobDataMap(); dataMap.put("key1", "value1"); JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").usingJobData(dataMap).build(); // Trigger the job to run on the next round minute Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); // Tell quartz to schedule the job using our trigger sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + runTime); // Start up the scheduler (nothing can actually run until the // scheduler has been started) sched.start(); log.info("------- Started Scheduler -----------------"); // wait long enough so that the scheduler as an opportunity to // run the job! log.info("------- Waiting 65 seconds... -------------"); try { // wait 65 seconds to show job Thread.sleep(65L * 1000L); // executing... } catch (Exception e) { // } // shut down the scheduler log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); example.run(); } }
須要添加log4j.properties
log4j.rootLogger=DEBUG,console,logFile log4j.additivity.org.apache=true # 控制檯(console) log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Threshold=DEBUG log4j.appender.console.ImmediateFlush=true log4j.appender.console.Target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n # 日誌文件(logFile) log4j.appender.logFile=org.apache.log4j.FileAppender log4j.appender.logFile.Threshold=DEBUG log4j.appender.logFile.ImmediateFlush=true log4j.appender.logFile.Append=true log4j.appender.logFile.File=E:/logs/log.log4j log4j.appender.logFile.layout=org.apache.log4j.PatternLayout log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
運行結果
[INFO ] 2016-03-11 17:44:25,686(0) --> [main] example1.SimpleExample.run(SimpleExample.java:40): ------- Initializing ---------------------- [INFO ] 2016-03-11 17:44:25,810(124) --> [main] org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1172): Using default implementation for ThreadExecutor [INFO ] 2016-03-11 17:44:25,817(131) --> [main] org.quartz.simpl.SimpleThreadPool.initialize(SimpleThreadPool.java:268): Job execution threads will use class loader of thread: main [INFO ] 2016-03-11 17:44:25,881(195) --> [main] org.quartz.core.SchedulerSignalerImpl.<init>(SchedulerSignalerImpl.java:61): Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl [INFO ] 2016-03-11 17:44:25,881(195) --> [main] org.quartz.core.QuartzScheduler.<init>(QuartzScheduler.java:240): Quartz Scheduler v.2.2.2 created. [INFO ] 2016-03-11 17:44:25,893(207) --> [main] org.quartz.simpl.RAMJobStore.initialize(RAMJobStore.java:155): RAMJobStore initialized. [INFO ] 2016-03-11 17:44:25,895(209) --> [main] org.quartz.core.QuartzScheduler.initialize(QuartzScheduler.java:305): Scheduler meta-data: Quartz Scheduler (v2.2.2) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. [INFO ] 2016-03-11 17:44:25,895(209) --> [main] org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1327): Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' [INFO ] 2016-03-11 17:44:25,895(209) --> [main] org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1331): Quartz scheduler version: 2.2.2 [INFO ] 2016-03-11 17:44:25,895(209) --> [main] example1.SimpleExample.run(SimpleExample.java:46): ------- Initialization Complete ----------- [INFO ] 2016-03-11 17:44:25,897(211) --> [main] example1.SimpleExample.run(SimpleExample.java:51): ------- Scheduling Job ------------------- [INFO ] 2016-03-11 17:44:25,951(265) --> [main] example1.SimpleExample.run(SimpleExample.java:63): group1.job1 will run at: Fri Mar 11 17:45:00 CST 2016 [INFO ] 2016-03-11 17:44:25,951(265) --> [main] org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:575): Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. [DEBUG] 2016-03-11 17:44:25,952(266) --> [DefaultQuartzScheduler_QuartzSchedulerThread] org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:276): batch acquisition of 0 triggers [INFO ] 2016-03-11 17:44:25,952(266) --> [main] example1.SimpleExample.run(SimpleExample.java:69): ------- Started Scheduler ----------------- [INFO ] 2016-03-11 17:44:25,952(266) --> [main] example1.SimpleExample.run(SimpleExample.java:73): ------- Waiting 65 seconds... ------------- [DEBUG] 2016-03-11 17:44:49,376(23690) --> [DefaultQuartzScheduler_QuartzSchedulerThread] org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:276): batch acquisition of 1 triggers [DEBUG] 2016-03-11 17:45:00,004(34318) --> [DefaultQuartzScheduler_QuartzSchedulerThread] org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:51): Producing instance of Job 'group1.job1', class=example1.HelloJob [DEBUG] 2016-03-11 17:45:00,007(34321) --> [DefaultQuartzScheduler_QuartzSchedulerThread] org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:276): batch acquisition of 0 triggers [DEBUG] 2016-03-11 17:45:00,007(34321) --> [DefaultQuartzScheduler_Worker-1] org.quartz.core.JobRunShell.run(JobRunShell.java:201): Calling execute on job group1.job1 [INFO ] 2016-03-11 17:45:00,007(34321) --> [DefaultQuartzScheduler_Worker-1] example1.HelloJob.execute(HelloJob.java:15): Hello World! - Fri Mar 11 17:45:00 CST 2016-value1 [DEBUG] 2016-03-11 17:45:25,844(60158) --> [DefaultQuartzScheduler_QuartzSchedulerThread] org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:276): batch acquisition of 0 triggers [INFO ] 2016-03-11 17:45:30,955(65269) --> [main] example1.SimpleExample.run(SimpleExample.java:83): ------- Shutting Down --------------------- [INFO ] 2016-03-11 17:45:30,956(65270) --> [main] org.quartz.core.QuartzScheduler.shutdown(QuartzScheduler.java:694): Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down. [INFO ] 2016-03-11 17:45:30,956(65270) --> [main] org.quartz.core.QuartzScheduler.standby(QuartzScheduler.java:613): Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. [DEBUG] 2016-03-11 17:45:30,957(65271) --> [main] org.quartz.simpl.SimpleThreadPool.shutdown(SimpleThreadPool.java:328): Shutting down threadpool... [DEBUG] 2016-03-11 17:45:31,010(65324) --> [DefaultQuartzScheduler_Worker-1] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,322(65636) --> [DefaultQuartzScheduler_Worker-2] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,322(65636) --> [DefaultQuartzScheduler_Worker-3] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-7] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-8] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-9] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-6] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-10] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-5] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,323(65637) --> [DefaultQuartzScheduler_Worker-4] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:612): WorkerThread is shut down. [DEBUG] 2016-03-11 17:45:31,324(65638) --> [main] org.quartz.simpl.SimpleThreadPool.shutdown(SimpleThreadPool.java:393): No executing jobs remaining, all threads stopped. [DEBUG] 2016-03-11 17:45:31,325(65639) --> [main] org.quartz.simpl.SimpleThreadPool.shutdown(SimpleThreadPool.java:395): Shutdown of threadpool complete. [INFO ] 2016-03-11 17:45:31,325(65639) --> [main] org.quartz.core.QuartzScheduler.shutdown(QuartzScheduler.java:771): Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete. [INFO ] 2016-03-11 17:45:31,325(65639) --> [main] example1.SimpleExample.run(SimpleExample.java:85): ------- Shutdown Complete -----------------