1. 程式人生 > >Quartz任務排程框架(啟動定時任務框架)

Quartz任務排程框架(啟動定時任務框架)

Quartz任務排程框架(啟動定時任務框架) Quartz是OpenSymphony開源組織在Jobscheduling領域又一個開源專案,它可以與J2EE與J2SE應用程式相結合也可以單獨使用。Quartz可以用來建立簡單或為執行十個,百個,甚至是好幾萬個Jobs這樣複雜的程式。Jobs可以做成標準的Java元件或 EJBs。Quartz的最新版本為Quartz 2.3.0。 官網:http://www.quartz-scheduler.org/座標:  

<dependency>

<groupId>org.quartz-scheduler</groupId>

<

artifactId>quartz</artifactId>

<version>2.2.1</version>

</dependency>

<dependency>

<groupId>org.quartz-scheduler</groupId>

<artifactId>quartz-jobs</artifactId>

<version>2.2.1</version>

</dependency>

<dependency><!—-

整合spring需要的事物 -->

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>4.1.7.RELEASE</version>

</dependency>

<dependency> <!—- 可選 -->

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId

>

<version>1.7.12</version>

</dependency>入門:  

// 定時器物件

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// 開啟定時任務

scheduler.start();

// 關閉定時任務

scheduler.shutdown();必須掌握 JobDetail Trigger 兩個物件Job 工作任務 ,你要做什麼Trigger 執行工作任務 觸發條件,什麼時間執行,多久執行一次編寫工作任務

public class HelloJob implements Job {

public void execute(JobExecutionContext context)

throws JobExecutionException {

       MailUtils.sendMail("標題", "內容", , "。。。");

       System.out.println("郵件已傳送");

    }

}編寫定時任務程式碼

public class Demo2 {

public static void main(String[] args) throws SchedulerException {

// 定時器物件

       Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// 定義一個工作物件

       JobDetail job = JobBuilder.newJob(HelloJob.class)

              .withIdentity("job1", "group1").build();

// 定義觸發器

       Trigger trigger = TriggerBuilder.newTrigger()

              .withIdentity("trigger1", "group1").startNow()

              .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(60))

              .build();

scheduler.scheduleJob(job, trigger);

// 開啟定時任務

scheduler.start();

    }

}物件TriggerBuilder 啟動任務時間 startNow 立即啟動 startAt(Date) 指定時間啟動物件SimpleScheduleBuilder 進行簡單任務重複執行   repeatSecondly…() 多少秒後重復執行   repeatminutely…() 多少分鐘後重復執行 repeatHourly…() 多少小時後重複執行CronTrigger 的使用   像日曆那樣觸發任務。一個cron表示式有至少6個(也可能7個)有空格分隔的時間元素。按順序依次為秒(0~59分鐘(0~59小時(0~23天(月)(0~31,但是你需要考慮你月的天數)月(0~11天(星期)(1~7 1=SUN SUNMONTUEWEDTHUFRISAT年份(19702099 舉幾個例子: 0 0 2 1 * ? * 表示在每月的1日的凌晨2點排程任務 0 15 10 ? * MON-FRI 表示週一到週五每天上午10:15執行作業 0 15 10 ? 6L 2002-2006 表示2002-2006年的每個月的最後一個星期五上午10:15執行作 -------------------------------------------------------------------------------------------------------------------- 每一個域可出現的字元如下: Seconds:可出現", - * /"四個字元,有效範圍為0-59的整數 Minutes:可出現", - * /"四個字元,有效範圍為0-59的整數 Hours:可出現", - * /"四個字元,有效範圍為0-23的整數 DayofMonth:可出現", - * / ? L W C"八個字元,有效範圍為0-31的整數 Month:可出現", - * /"四個字元,有效範圍為1-12的整數或JAN-DEc DayofWeek:可出現", - * / ? L C #"四個字元,有效範圍為1-7的整數或SUN-SAT兩個範圍。1表示星期天,2表示星期一, 依次類推 Year:可出現", - * /"四個字元,有效範圍為1970-2099年 每一個域都使用數字,但還可以出現如下特殊字元,它們的含義是: (1)*:表示匹配該域的任意值,假如在Minutes域使用*,即表示每分鐘都會觸發事件。 (2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和 DayofWeek會相互影響。例如想在每月的20日觸發排程,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?, 其中最後一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣。 (3)-:表示範圍,例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次 (4)/:表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味著5分鐘觸發一次,而25,45等分別觸發一次. (5),:表示列出列舉值值。例如:在Minutes域使用5,20,則意味著在5和20分每分鐘觸發一次。 (6)L:表示最後,只能出現在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味著在最後的一個星期四觸發。 (7)W: 表示有效工作日(週一到週五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。例如:在DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(週一)觸發;如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份 (8)LW:這兩個字元可以連用,表示在某個月最後一個工作日,即最後一個星期五。 (9)#:用於確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三。 --------------------------------------------------------------------------------------------------------------------  

public class Demo3 {

public static void main(String[] args) throws SchedulerException {

// 定時器物件

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// 定義一個工作物件

        JobDetail job = JobBuilder.newJob(HelloJob.class)

                .withIdentity("job1", "group1").build();

// 定義觸發器

        Trigger trigger = TriggerBuilder.newTrigger()

                .withIdentity("trigger1", "group1")

                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 ? * *"))

                .build();

scheduler.scheduleJob(job, trigger);

// 開啟定時任務

scheduler.start();

    }

}Quartz Spring 整合使用配置檔案:web.xml spring配置applicationContext.xml檔案位置spring核心監聽器 --------------------------------------------------------------------------------------------------------------------application.xml: 附件: applicationContext.zip (1 K) 下載次數:0<!--  掃描sprig註解--><context:component-scan base-package="cn.itcast.quartz.service"/>Spring提供 JobDetailFactoryBean

<!--job -->

<bean id="helloJob"

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

<property name="jobClass"value="cn.itcast.quartz.job.HelloJob" />

    <!—valuejob類的全類名 -->

</bean> Spring 提供 TriggerFactoryBean

<!--trigger -->

<bean id="simpleTrigger"

    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">

<property name="jobDetail"ref="helloJob"/>

<!-- 3秒後第一次執行 -->

<property name="startDelay"value="3000" />

<!-- 5秒後重復執行 -->

<property name="repeatInterval"value="5000" />

</bean> Spring 提供 SchedulerFactoryBean

<!--scheduler  -->

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<property name="jobFactory"ref="jobFactory"/>

<property name="triggers">

<list>

<ref bean="simpleTrigger"/>

</list>

</property>

</bean>

@Service("jobFactory")

public class JobFactory extends AdaptableJobFactory { --------------------------------------------------------------------------------------------------------------------測試: @Service

public class HelloService {

public void sayHello() {

        System.out.println("hello,quartz spring !!!~~");

    }

}job呼叫service層:

public class HelloJob implements Job {

@Autowired

private HelloService helloService;

public void execute(JobExecutionContext context)

throws JobExecutionException {

helloService.sayHello();

    }

}quartz監聽器:

@Service("jobFactory")

public class JobFactory extends AdaptableJobFactory {

@Autowired

private AutowireCapableBeanFactory capableBeanFactory;

@Override

protected Object createJobInstance(TriggerFiredBundle bundle)

throws Exception {

        Object jobInstance = super.createJobInstance(bundle);

        capableBeanFactory.autowireBean(jobInstance);

return jobInstance;

    }

}