【Springboot】快速整合Quartz

kamier發表於2022-12-22

一、引言

在java中最常用的定時任務框架當屬quartz了,早在spring boot還未釋出之前,spring就已經在spring-context-support包中對quartz進行了整合,而使用spring boot來整合quartz就變的尤為方便、快捷。

二、快速整合

2.1 pom引入starter依賴

spring boot最重要的就是它的外掛化設計,想引入哪個模組或框架一般只需引入對應的starter即可,quartz也是一樣,如下

<!-- 整合quartz -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

(這裡的spring-boot-starter-quartz沒有寫明version版本,預設與spring boot的版本一致即可)

在pom中點選spring-boot-starter-quartz進去可以看到其內部依賴spring-boot-starter、spring-context-support、spring-tx以及quartz,如下

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.6.6</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.18</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.18</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

2.2 定義任務類

自定義的任務類需要實現quartz提供的Job介面,樣例如下

/**
 * 任務類
 */
public class MyJob1 implements Job {

    @Autowired
    private MyService1 myService1;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
//        System.out.println("任務建立人:" + jobDataMap.getString("createUser"));
        myService1.work();
    }
}

如上程式碼中,任務類中可以直接使用@Autowired來注入bean,這為我們編寫任務類時提供了很好的便利,不需要透過任務引數jobDataMap來傳入bean了。MyService1是一個簡單的bean,程式碼如下

@Service
public class MyService1 {
    public void work() {
        String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(now + ": service1正在工作...");
    }
}

2.3 建立定時任務

下面透過定義一個ApplicationRunner,在spring容器啟動後,執行run方法來簡單地建立一個定時任務,程式碼如下

@Component
public class MyApplicationRunner implements ApplicationRunner {

    @Autowired
    private Scheduler scheduler;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 建立任務明細
        JobDetail jobDetail = JobBuilder.newJob(MyJob1.class)
                .withIdentity("myJob1", "job_group")
//                .usingJobData("createUser", "kamier")   // 可以放一些任務資料
                .build();

        // 建立觸發器,每隔5秒執行一次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger1", "trigger_group")
                .withSchedule(cronScheduleBuilder)
                .build();

        // 排程定時任務
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

2.4 測試驗證

啟動spring boot工程後,控制檯列印如下,說明定時任務排程成功

相關文章