| Job 寫法 | Trigger 類型 | 對應類 |
|---|---|---|
| 繼承 QuartzJobBean | 簡單觸發(固定間隔) | SimpleTriggerBean |
| 繼承 QuartzJobBean | Cron 觸發(指定時間) | CronTriggerBean |
| POJO 普通類 | 簡單觸發 | MethodInvokingJobDetailFactoryBean + SimpleTriggerBean |
| POJO 普通類 | Cron 觸發 | MethodInvokingJobDetailFactoryBean + CronTriggerBean |
推薦:POJO 寫法(不侵入業務代碼,保持純淨)
public class Job1 extends QuartzJobBean {
private int timeout;
private static int i = 0;
public void setTimeout(int timeout) { this.timeout = timeout; }
@Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
System.out.println("繼承QuartzJobBean方式-調度 " + ++i + " 進行中...");
}
}
<!-- JobDetail -->
<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="bean.jobDetailBean.Job1" />
<property name="jobDataAsMap">
<map><entry key="timeout" value="0" /></map>
</property>
</bean>
<!-- CronTrigger: 每分鐘的 0,10,20,30,40,50 秒觸發 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="job1" />
<property name="cronExpression" value="0,10,20,30,40,50 * * * * ?" />
</bean>
<!-- SchedulerFactory -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref bean="cronTrigger" /></list>
</property>
</bean>
public class Job2 {
private static int i = 0;
public void doJob2() {
System.out.println("不繼承QuartzJobBean方式-調度 " + ++i + " 進行中...");
}
}
<!-- MethodInvokingJobDetailFactoryBean 包裝 POJO -->
<bean id="job2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<bean class="bean.jobDetailBean.Job2" />
</property>
<property name="targetMethod" value="doJob2" />
<property name="concurrent" value="false" /><!-- 禁止併發執行 -->
</bean>
<!-- SimpleTrigger: 啟動 0 秒後開始,每 2 秒執行一次 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="job2" />
<property name="startDelay" value="0" />
<property name="repeatInterval" value="2000" />
</bean>
<!-- SchedulerFactory -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref bean="simpleTrigger" /></list>
</property>
</bean>
欄位: 秒 分 時 日 月 週 年(可選)
範例: 0 0 12 * * ? * → 每天中午 12:00
0/5 * * * * ? * → 每 5 秒
0 0 10,14,16 * * ? → 每天 10:00、14:00、16:00
特殊字元: , (列舉) - (範圍) * (所有) / (增量) ? (不指定) L (最後) W (工作日) # (第N個)
public class ScheduleTest {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext*.xml");
// 容器啟動即自動啟動 SchedulerFactoryBean,排程開始執行
}
}
concurrent=false:上次執行未結束時,不啟動新執行緒(防止併發問題)startDelay:啟動延遲(毫秒)repeatInterval:重複間隔(毫秒)cronExpression:Cron 運算式,功能強大但複雜度較高