天天看點

Springboot 使用Quartz定時器執行多個定時任務 配置篇

首先在開篇前,先放一個Springboot簡單使用定時器的文章:

那當然還有一篇稍微進階點的,動态排程:

現在這篇是比較傳統一點的,手動配置的方式:

定時任務配置包括  :    

jobDetail 任務執行個體     定時任務執行的具體内容等 -相關業務代碼    

trigger 觸發器     設定相關的運作周期等    -綁定任務執行個體      (這篇文章會介紹包括兩種觸發器,簡單的以及設定cron的)

scheduler 排程器     決定哪些定時任務會執行  -綁定觸發器 

OK,接下來我們開始。

首先是導入Quartz定時器會用到的相關依賴包:

<!-- scheduled所屬資源為spring-context-support,在Spring中對Quartz的支援,是內建在spring-context-support包中。
         org.springframework.scheduling.quartz
      -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!-- Quartz坐标 -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
            <!-- Quartz預設需要slf4j支援。springboot中,提供了更高版本的slf4j -->
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>      

然後看下我們這次的實踐裡整體需要弄得幾個檔案:

Springboot 使用Quartz定時器執行多個定時任務 配置篇

建立第一個定時任務的執行個體,TaskJobOne.class  :   (注意這裡的@EnableScheduling 别忘記了)

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.lang.Thread.sleep;

/**
 * @Author : JCccc
 * @CreateTime : 2020/3/9
 * @Description :
 **/
@Component
@EnableScheduling
public class TaskJobOne {


    public  void testJobOneMethod() throws InterruptedException {
        System.out.println("1  定時任務1正在執行......"+new Date());
        sleep(1000);

        System.out.println("1  定時任務1業務代碼執行完畢......"+new Date());
    }
}      

 然後是建立多個,也就是第二個定時任務的執行個體,TaskJobTwo.class: (注意這裡的@EnableScheduling 别忘記了)

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.lang.Thread.sleep;

/**
 * @Author : JCccc
 * @CreateTime : 2020/3/9
 * @Description :
 **/

@Component
@EnableScheduling
public class TaskJobTwo {


    public  void testJobTwoMethod() throws InterruptedException {
        System.out.println("2  定時任務2正在執行......" + new Date());
        sleep(1000);

        System.out.println("2  定時任務2業務代碼執行完畢......"+new Date());
    }
    
}      

然後是給這些任務執行個體綁定觸發器,然後将觸發器加入到排程工廠裡:

建立 QuartzConfiguration.class:

(注意看每一步的注釋,或者看後面我的簡要要點描述!)

import com.demo.elegant.quartz.taskOne.TaskJobOne;
import com.demo.elegant.quartz.taskTwo.TaskJobTwo;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import java.util.Date;

/**
 * @Author : JCccc
 * @CreateTime : 2020/3/9
 * @Description :
 **/

@Configuration
public class QuartzConfiguration {




/*
定時任務配置包括  :
    jobDetail 任務執行個體
    定時任務執行的具體内容等 -相關業務代碼
    trigger 觸發器
    設定相關的運作周期等    -綁定任務執行個體
    scheduler 排程器
    決定哪些定時任務會執行  -綁定觸發器
*/

    /**
     * 定時任務 1
     */

    // 配置定時任務1的任務執行個體
    @Bean(name = "firstJobDetail")

    public MethodInvokingJobDetailFactoryBean firstJobDetail(TaskJobOne taskJobOne) {
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        // 是否并發執行
        jobDetail.setConcurrent(false);
        // 為需要執行的實體類對應的對象
        jobDetail.setTargetObject(taskJobOne);
        // 需要執行的方法
        jobDetail.setTargetMethod("testJobOneMethod");
        return jobDetail;
    }


    // 配置觸發器1
    @Bean(name = "firstTrigger")
    public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {
        SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
        trigger.setJobDetail(firstJobDetail);
        // 設定任務啟動延遲
        trigger.setStartDelay(0);
        // 設定定時任務啟動時間
        trigger.setStartTime(new Date());
        // 每5秒執行一次
        trigger.setRepeatInterval(5000);
        return trigger;
    }


    /**
     * 定時任務 2
     *
     * @param taskJobTwo
     * @return
     */

    // 配置定時任務2的任務執行個體
    @Bean(name = "secondJobDetail")
    public MethodInvokingJobDetailFactoryBean secondJobDetail(TaskJobTwo taskJobTwo) {
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        // 是否并發執行
        jobDetail.setConcurrent(true);
        // 為需要執行的實體類對應的對象
        jobDetail.setTargetObject(taskJobTwo);
        // 需要執行的方法
        jobDetail.setTargetMethod("testJobTwoMethod");
        return jobDetail;
    }

    // 配置觸發器2
    @Bean(name = "secondTrigger")
    public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
        trigger.setJobDetail(secondJobDetail);
        // 設定定時任務啟動時間
        trigger.setStartTime(new Date());
        // cron表達式
        trigger.setCronExpression("*/7 * * * * ?");
        return trigger;
    }


    // 配置Scheduler
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 延時啟動,應用啟動1秒後
        bean.setStartupDelay(1);
        // 注冊觸發器
        bean.setTriggers(firstTrigger, secondTrigger);
        return bean;
    }


}      

要點描述1:

将我們的執行個體配置成為定時任務執行個體

Springboot 使用Quartz定時器執行多個定時任務 配置篇

要點描述2:  

綁定觸發器 簡單觸發器:

Springboot 使用Quartz定時器執行多個定時任務 配置篇

要點描述3:

綁定可以使用cron表達式的觸發器,這次實踐裡面我們的任務2就是:

Springboot 使用Quartz定時器執行多個定時任務 配置篇

要點描述4:

将配置好的觸發器加入排程工廠:

Springboot 使用Quartz定時器執行多個定時任務 配置篇

運作一下,可以看到2個定時任務都正常運作:

繼續閱讀