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

posted @ 2022-02-17 18:12  MyDistance  阅读(1306)  评论(0编辑  收藏  举报