Spring 提供 org.springframework.scheduling.quartz 套件,以 Bean 定義方式配置 Quartz Job、Trigger 與 Scheduler,避免硬編碼,支援依賴注入,極大簡化排程任務管理。
<bean id="mainJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="jobs.MainJob"/> <!-- 實作 QuartzJobBean 的類別 -->
<property name="jobDataAsMap"> <!-- 注入資料 -->
<map>
<entry key="data" value="data"/>
</map>
</property>
</bean>
<bean id="mainTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="mainJob"/>
<property name="startDelay" value="6000"/> <!-- 啟動 6 秒後首次執行 -->
<property name="repeatCount" value="0"/> <!-- 0 表示無限重複 -->
<property name="repeatInterval" value="3600000"/> <!-- 每小時執行一次 -->
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">10</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<prop key="org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread">true</prop>
</props>
</property>
<property name="triggers">
<list>
<ref bean="mainTrigger"/> <!-- 可註冊多個觸發器 -->
</list>
</property>
</bean>
public class MainJob extends QuartzJobBean {
private Logger logger = Logger.getLogger(getClass());
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.debug("Just say hi."); // 實際業務邏輯
}
}
繼承 QuartzJobBean 而非直接實作 Job,可享受 Spring 依賴注入與 jobDataAsMap 自動綁定。
| 屬性 | 說明 |
|---|---|
| startDelay | 啟動延遲(毫秒),避免應用啟動期資源爭用 |
| repeatCount | 重複次數,0=無限,>0 為具體次數 |
| repeatInterval | 重複間隔(毫秒) |
| jobDataAsMap | 傳遞給作業的資料,在 executeInternal 透過 context.getJobDetail().getJobDataMap() 取得 |
| quartzProperties | 對應 quartz.properties 設定,執行緒池等核心參數 |
應用啟動後,Spring 自動初始化 Scheduler、註冊 Trigger、啟動排程。日誌將顯示作業按間隔執行。
CronTriggerBean 實現行事曆式排程SchedulerFactoryBean 支援 jobDetails 屬性直接註冊作業(無需 Trigger)JDBCJobStore 並設定 org.quartz.scheduler.instanceId=AUTO@Transactional 或程式式事務管理