Quartz Sheduler 入門


Quartz Sheduler 入門

原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/

下載地址:http://quartz-scheduler.org/downloads

什么是 Quartz Scheduler?

Quartz Scheduler 是一個功能豐富,開源了的任務調度庫,可以集成在幾乎任何java應用程序(從最小的獨立的應用程序到最大的電子商務系統)
Quartz以用來創建簡單或復雜的計划表來執行數十,數百,或者成千上萬個任務,這些任務被定義為標准的java組件,可以執行幾乎任何你想讓他們做的事,Quartz Scheduler包含很多企業級功能,例如支持JTA事務,集群等!

Quartz 可以為你做什么

如果你的應用有任務需要在給定的時間准時執行,或者你的系統有定期的維護工作,那么Quartz就是你的理想解決方案。

使用Quartz進行任務調度的實例:

  • 租車過程:有人租車下了一個新的訂單,安排2小時后用,到時,將系統將先確定訂單狀態,如果該訂單還沒收到過確認消息,則向他發出警告消息,並將訂單狀態改為等待干預。

  • 系統維護:安排一個工作,每個工作日(節假日除外的所有平日)的11:30將數據庫的內容放到一個XML文件中。

  • 在應用中提供提醒服務。

Quartz 特征(Quartz Features)

運行環境(Runtime Environments)

  • Quartz可以在另一個自由獨立的應用程序中運行
  • Quartz可以在一個應用服務器中(或者servlet容器中)被實例化,並參與事務處理
  • Quartz可以作為一個獨立的的程序(自己的java虛擬機內)運行,被遠程接口調用。
  • Quartz可以被實例化為一組獨立的程序(擁有負載均衡和故障轉移能力)來執行工作。

任務調度(Job Scheduling)

當一個給定的觸發器(Trigger)觸發時,任務(Job)將執行。觸發器可以被下列指令的任何組合所創建:

  • 一天中的某個特定時間(到毫秒)
  • 一周中的特定幾天
  • 一個月中的特定幾天
  • 一年中的特定幾天
  • 日歷中非特定的幾天(例如商務假期)
  • 重復特定次數
  • 重復直到某個特定時間
  • 無限的重復
  • 在特定間隔后重復

任務(Job)可以被命名並被放置於一個組(Group)中,觸發器(Trigger)也可以被命名並被放入一個組(Group)中,這樣可以在調度器(scheduler)中很好的的組織安排它們。
一個任務(Job)只能被調度器(scheduler)添加一次,但是可以注冊在多個觸發器(Trigger)中。
在企業級的Java環境中,任務(Job)可以作為分布式事務的一部分執行它們的工作

任務執行(Job Execution)

  • 任務(Job)可以是任何實現簡單Job接口的Java類,你的類可以執行其他任何操作
  • 任務(Job)類的實例可以被Quartz實例化,也可以被應用的框架實例化
  • 當一個觸發器(Trigger)觸發時,調度器(Scheduler)程序將通知實現了JobListener和TriggerListener接口的Java對象(監聽器可以是簡單的Java對象, 或者EJBs, 或者JMS publishers, etc)。這些監聽器在任務(Job)執行完后,也會收到通知
  • 當任務(Job)完成時, 他們返回JobCompletionCode (告知調度程序失敗或者成功)。JobCompletionCode 還可以指示調度程序(Scheduler)基於成功或者失敗執行操作,例如立即重新執行任務(Job)

任務持久化(Job Persistence)

  • Quartz的設計包括一個JobStore接口的實現,可以提供任務(Job)存儲的多種機制。
  • 當使用了JDBCJobStore, 所有被配置為非易失的任務(Job)和觸發器(Trigger)將通過JDBC存儲在關系數據庫中
  • 當使用了RAMJobStore, 所有的任務(Job)和觸發器(Trigger)被存儲在RAM中,因此在程序執行時,並不具有持久性,但這不需要外部數據庫

事務(Transactions)

  • Quartz可以可以通過使用JobStoreCMT(JDBCJobStore的一個子類),參與JTA事務
  • 在執行任務(Job)時,Quartz可以管理JTA事務(啟動和調用),以便被任務執行的工作在JTA事務中自動執行了。

集群特征(Cluster)

  • 提供故障切換
  • 提供負載均衡
  • Quartz的內置集群特征依賴數據庫持久化(通過JDBCJobStore)
  • Terracotta ,Quartz的拓展,提供不需要后端數據庫支持的集群功能

監聽器&&插件

  • 應用(Application)通過繼承listener接口捕獲調度事件,來監控或者控制Job/Trigger
  • 插件機制可以被用來給Quartz添加功能, 例如保存任務執行的記錄,從文件中加載Job/Trigger的定義
  • Quartz可以裝載大量的已完成的監聽器和插件

配置Quartz Scheduler

一個簡單的 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 -----------------

另外可參考http://ifeve.com/?s=Quartz


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM