SpringBoot 簡單整合 quartz 實現定時任務


SpringBoot 簡單整合 quartz 實現定時任務

遇到了定時任務的需求,這里不使用 springboot 自帶的 @Scheduled 注解,使用的是第三方框架 quartz。

1、Quartz 核心組件

  • 調度器:Scheduler。
  • 任務:Job。
  • 觸發器:Trigger,包括 SimpleTrigger 和 CronTrigger。

1.1、Job(任務):是一個接口,有一個方法 void execute(),可以通過實現該接口來定義需要執行的任務。

1.2、Trigger(觸發器):描述觸發 Job 執行的時間觸發規則,實現類 SimpleTrigger 和 CronTrigger 可以通過crom 表達式定義出各種復雜的調度方案。

1.3、Scheduler(調度器):代表一個 quartz 的獨立運行容器。Trigger 和 JobDetail 可以注冊到 Scheduler 中。Scheduler 可以將 Trigger 綁定到某一 JobDetail 上,這樣當 Trigger 被觸發時,對應的 Job 就會執行。一個 Job 可以對應多個 Trigger,但一個 Trigger 只能對應一個 Job 。

2、CronTrigger 表達式規則

image-20220217175956401
可通過在線生成 cron 表達式的工具:http://cron.qqe2.com/ 來生成自己想要的表達式。

以下是 cron 表達式的例子:

img

3、整合 quartz

3.1、添加 jar 包依賴

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.2</version>
</dependency>

3.2、實現 Job 接口,在 execute 方法中實現業務邏輯

public class TestJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("===========成功運行定時任務===========");
        System.out.println(jobExecutionContext.getJobDetail().getKey());
    }
}

3.3、創建啟動加載類,創建 JobDetail 實例、Trigger 觸發器注冊到 scheduler, 並開啟調度

@Component
public class TestRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        //創建scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();

        //創建TestJob的JobDetail實例,並設置name
        JobDetail jobDetail = JobBuilder.newJob(TestJob.class)
                .withIdentity("testDetail")
                .build();

        //cron表達式,每秒執行一次
        String cron = "0/1 * * * * ? ";

        //創建Trigger觸發器,使用cronSchedule方式調度
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("testTrigger")
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();

        //注冊JobDetail實例到scheduler,並使用對應的trigger觸發
        scheduler.scheduleJob(jobDetail, trigger);
        //啟動scheduler
        scheduler.start();
    }
}

3.4、啟動 main 程序,程序加載成功后開始運行任務

image-20220217174551181

參考資料:https://blog.csdn.net/pan_junbiao/article/details/109556822

參考資料:https://www.jianshu.com/p/dc814e8014b0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM