Quartz 是企業級 Java 定時任務框架,支援 Cron 運算式、集群、持久化。本文以 Spring XML 配置為例,詳細說明 JobDetail、Trigger、SchedulerFactoryBean 整合與 Cron 運算式語法。
<!-- 1. 任務邏輯 Bean -->
<bean id="bcdTask" class="com.tmp.task.BcdTask" />
<!-- 2. JobDetail:指定調用對象與方法 -->
<bean id="tmpJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="bcdTask" />
<property name="targetMethod" value="tmpWork" />
</bean>
<!-- 3. CronTrigger:定義排程 -->
<bean id="tmpTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="tmpJob" />
<property name="cronExpression" value="0 10/5 * * * ?" /> <!-- 每分鐘第 10 秒開始每 5 秒 -->
</bean>
<!-- 4. Scheduler 工廠 -->
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="startupDelay" value="60" /> <!-- 應用啟動 60 秒後啟動排程 -->
<property name="triggers">
<list><ref bean="tmpTrigger" /></list>
</property>
</bean>
格式:秒 分 時 日 月 週 [年](6 或 7 域)
| 域 | 允許值 | 特殊字符 |
|---|---|---|
| 秒 | 0-59 | , - * / |
| 分 | 0-59 | , - * / |
| 時 | 0-23 | , - * / |
| 日 | 1-31 | , - * / L W |
| 月 | 1-12 / JAN-DEC | , - * / |
| 週 | 1-7 / SUN-SAT | , - * / L # |
| 年(可選) | 1970-2099 | , - * / |
*:所有值?:無具體值(僅日/週互斥時用)-:範圍,如 10-12,:列表,如 MON,WED,FRI/:增量,0/15 表示 0,15,30,45L:Last,日域=月末,週域=週六W:工作日,最近的工作日#:第 N 個週X,如 6#3 = 第 3 個週五| 運算式 | 含義 |
|---|---|
| 0 0 12 * * ? | 每天中午 12:00 |
| 0 15 10 ? * * | 每天 10:15 |
| 0 0/5 14 * * ? | 每天 14:00-14:55 每 5 分鐘 |
| 0 15 10 ? * MON-FRI | 週一至週五 10:15 |
| 0 15 10 15 * ? | 每月 15 號 10:15 |
| 0 15 10 L * ? | 每月最後一天 10:15 |
| 0 15 10 ? * 6L | 每月最後一個週五 10:15 |
| 0 15 10 ? * 6#3 | 每月第三個週五 10:15 |
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.jobStore.isClustered">true</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
</props>
</property>
<property name="triggers">
<list><ref bean="tmpTrigger" /></list>
</property>
</bean>
@Configuration
@EnableScheduling
public class QuartzConfig {
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(MyJob.class).storeDurably().build();
}
@Bean
public Trigger trigger(JobDetail jobDetail) {
return TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 * * * ?"))
.build();
}
}
@Component
public class MyJob extends QuartzJobBean {
@Override protected void executeInternal(JobExecutionContext ctx) {
// 任務邏輯
}
}