簡介 Quartz是一個完全由java編寫的開源作業調度框架,其實是啟動定時任務的框架。使用時只需創建一個org.quartz.Job介面的實現類,實現唯一的方法:public void execute(JobExecutionContext context) throws JobExecution ...
簡介 Quartz是一個完全由java編寫的開源作業調度框架,其實是啟動定時任務的框架。使用時只需創建一個org.quartz.Job介面的實現類,實現唯一的方法:public void execute(JobExecutionContext context) throws JobExecutionException,將你的邏輯任務添加到execute()方法即可。 一、基本概念 (一)、執行對象 Job :工作任務 ,你要做什麼 Trigger:執行工作任務 觸發條件 , 什麼時間執行, 多久執行一次編寫工作任務
(二)、 CronTrigger 的使用
如果你需要像日曆那樣按日程來觸發任務,而不是像 SimpleTrigger 那樣每隔特定的間隔時間觸發,CronTriggers 通常比 SimpleTrigger 更有用。
Cron Expressions ——Cron
1. Seconds 秒
2. Minutes 分鐘
3. Hours 小時
4. Day-of-Month 月中的天
5. Month 月
6. Day-of-Week 周中的天
7. Year (optional field) 年(可選的域)
所有的域中的值都有特定的合法範圍,這些值的合法範圍相當明顯,例如:秒和分域的合法值為 0 到 59,小時的合法範圍是 0 到 23,Day-of-Month 中值得合法凡範圍是 0 到 31,但是需要註意不同的月份中的天數不同。月份的合法值是 0 到 11。或者用字元串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及 DEC 來表示。Days-of-Week可以用1到7來表示(1=星期日)或者用字元串SUN, MON, TUE, WED,THU, FRI 和 SAT 來表示.
通配符('*')可以被用來表示域中“每個”可能的值。因此在"Month"域中的*表示每個月,而在 Day-Of-Week 域中的*則表示“周中的每一天”。
'/'字元用來表示值的增量,例如, 如果分鐘域中放入'0/15',它表示“每隔 15 分鐘,從 0 開始”,如果在份中域中使用'3/20',則表示“小時中每隔 20 分鐘,從第 3 分鐘開始”或者另外相同的形式就是'3,23,43'。
0 0 12 ? * 3 每周二中午 12 點執行任務
0 0 0 0 * ? 每月 1 日 0 點執行任務
註意:4.月中天和6.周中天不能同時取到*,表示任意一天時一個用*,另一個用?
二、 Spring 整合Quartz
在 Job 中 spring 管理的 Bean 無法註入,需要在 Scheduler 中自定義 JobFactory解決。 (一)、創建JobFactory,用於註入Job實現Spring管理@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; } }(二)、配置applicationContext.xml 1、開啟包掃描(JobFactory、工作任務的Service層所在的包)
<context:component-scan base-package="com.hehe.quartz.service" />
2、工作任務JobDetail配置----(JobDetailFactoryBean)
<bean id="helloJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
// 註入調度任務Job的Class文件 <property name="jobClass" value="cn.itcast.quartz.job.HelloJob"/> </bean>
3、觸發器Trigger配置----(SimpleTriggerFactoryBean)
// simmpleTrigger
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
// 註入調度任務job
<property name="jobDetail" ref="helloJob" />
// 設置多久後開始執行(0秒後執行)
<property name="startDelay" value="0" />
// 設置多久迴圈執行一次(1分鐘迴圈1次)
<property name="repeatInterval" value="60000" />
</bean>
// cronTrigger
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="exampleJob"/>
<property name="cronExpression" value="0 0 6 * * ?"/>
</bean>
4、調度任務Scheduler配置----(SchedulerFactoryBean)
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> // 註入工作任務附: 1、quartz 2.2.1 的 Maven 坐標:
<property name="jobFactory" ref="jobFactory"/>
// 註入觸發器 <property name="triggers"> <list> <ref bean="simpleTrigger"/> </list> </property> </bean>
<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>