首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 整合 Quartz 排程器完整指南:兩種 Job 寫法、兩種 Trigger 模式與 XML 配置詳解

     編輯:Java 相關知識

Quartz 在 Spring 中的四種組合

Job 寫法Trigger 類型對應類
繼承 QuartzJobBean簡單觸發(固定間隔)SimpleTriggerBean
繼承 QuartzJobBeanCron 觸發(指定時間)CronTriggerBean
POJO 普通類簡單觸發MethodInvokingJobDetailFactoryBean + SimpleTriggerBean
POJO 普通類Cron 觸發MethodInvokingJobDetailFactoryBean + CronTriggerBean

推薦:POJO 寫法(不侵入業務代碼,保持純淨)

方案一:繼承 QuartzJobBean + CronTrigger

1. Job 類

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 + " 進行中...");
    }
}

2. Spring XML 配置

<!-- 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>

方案二:POJO 類 + SimpleTrigger(推薦)

1. Job 類(純 POJO)

public class Job2 {
    private static int i = 0;
    public void doJob2() {
        System.out.println("不繼承QuartzJobBean方式-調度 " + ++i + " 進行中...");
    }
}

2. Spring XML 配置

<!-- 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>

Cron 運算式速查

欄位:     秒  分  時  日  月  週  年(可選)
範例:     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 運算式,功能強大但複雜度較高
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved