在Quartz中除了使用最簡單的Simple Trigger以外,也可以使用類似Linux上Cron作業的CronTrigger的方式來運作Job,下面是一個小例子:
1. 首先是一個任務類,這個類沒有實作任何接口,其中包含一個run方法用來運作這個task,代碼如下:
[java]
view plain copy print ?- package org.garbagecan.springstudy.schedule.quartz;
- public class MyTask {
- private String name;
- public void run() {
- System.out.println("Run task: " + name + ".");
- }
- public String getName() {
- return name;
- public void setName(String name) {
- this.name = name;
- }
2. 一個Job類,這個類需要繼承spring的QuartzJobBean類,來說明目前類是一個Quartz的Job類,類包含了一個Task類的對象執行個體,在每次Job被排程的時候,将會運作其中的executeInternal方法,代碼如下:
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- public class MyJob extends QuartzJobBean {
- private MyTask myTask;
- protected void executeInternal(JobExecutionContext context)
- throws JobExecutionException {
- myTask.run();
- public MyTask getMyTask() {
- return myTask;
- public void setMyTask(MyTask myTask) {
- this.myTask = myTask;
3. Spring配置檔案,内容如下
[html]
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
- default-lazy-init="true">
- <bean id="timerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
- <property name="triggers">
- <list>
- <ref local=""cronTrigger""/>
- </list>
- </property>
- </bean>
- <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail" ref="myJob"/>
- <property name="cronExpression" value="0/10 * * * * ?"></property>
- <bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
- <property name="name" value="myJob"/>
- <property name="group" value="myGroup"/>
- <property name="description" value="myJob"/>
- <property name="jobClass" value="org.garbagecan.springstudy.schedule.quartz.MyJob"/>
- <property name="jobDataAsMap">
- <map>
- <entry key="myTask" value-ref="myTask" />
- </map>
- <bean id="myTask" class="org.garbagecan.springstudy.schedule.quartz.MyTask">
- <property name="name" value="my task"/>
- </beans>
3.1 首先,需要定義了一個Task類,具體的任務邏輯可以寫在這個類裡;
3.2 定義一個JobDetailBean類的bean,這個是為了适應Quartz的JobDetail,其中可以定義name,group,description等資訊,這些資訊主要是為了和别的作業做區分使用;其中還有一個jobClass屬性,定義了使用的是那個Job類執行個體,這裡使用第二步建立的MyJob類;最後定義了一個叫jobDataAsMap的屬性,這個屬性是Quartz提供的用來傳遞參數使用的一個Map集合,這些集合裡的類會被spring自動注入到目标Job類中;
3.3 建立一個觸發器類,這裡使用的是Quartz提供的Cron Trigger,在Spring裡,使用的是CronTriggerBean來做映射,主要是定義cron表達式,具體可以參考quartz的官方文檔,這裡定義的是每隔10秒運作一次;當然還有最主要的具體的Job類執行個體;
3.4 最後定義了一個SchedulerFactoryBean的bean,其中定義了具體要排程那些觸發器;
4. 最後,寫一個測試類來測試上面的代碼和配置
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Test {
- public static void main(String[] args) throws Exception {
- new ClassPathXmlApplicationContext("/org/garbagecan/springstudy/schedule/quartz/spring.xml");
運作Test類,可以看到一個叫my task的job會啟動,并且每隔10秒運作一次。