SpringBoot工程集成Quartz

本文介绍了如何在SpringBoot项目中集成Quartz作业调度框架。详细讲述了Quartz的基本概念,包括Job、Trigger和Scheduler等核心组件的功能及作用。并通过具体示例展示了如何配置依赖、实现Job接口、设置任务线程以及运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot工程集成Quartz

一、Quartz简介

  Quartz是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。它允许程序开发人员根据时间的间隔来调度作业。实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。

二、Quartz核心思想

  • Job 任务的接口,所有任务都需要实现这一接口,此接口中只有一个execute方法;
  • JobDetail 表示一个具体的可执行的任务,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
  • Trigger 触发器,代表一个调度参数的配置,什么时候去调。
  • Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。

三、集成Quartz

1、POM依赖导入

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

2、JOB接口实现

public class DemoJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Hello world!:" + jobExecutionContext.getJobDetail().getKey()+ LocalDateTime.now());
    }
}

3、任务线程

public class QuartzThread extends Thread {

    private String name;

    public QuartzThread(String name) {
        this.name = name;
    }

    @SneakyThrows
    @Override
    public void run() {
        super.run();
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 创建HelloworldJob的JobDetail实例,并设置name/group
        JobDetail jobDetail = JobBuilder.newJob(DemoJob.class)
                .withIdentity("demoJob","demoJobGroup1")
                //JobDataMap可以给任务传递参数
                .usingJobData("job_param","job_param1")
                .build();
        // 创建Trigger触发器设置使用cronSchedule方式调度
        String str1 = "2020-10-20 15:22:59";
        String str2 = "2020-10-20 15:24:00";
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("demoTrigger","demoTriggerGroup1")
                .usingJobData("job_trigger_param","job_trigger_param1")
                .startAt(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(str1))
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(500).repeatForever())
                .endAt(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(str2))
				// .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
        // 注册JobDetail实例到scheduler以及使用对应的Trigger触发时机
        scheduler.scheduleJob(jobDetail,trigger);
        // 启动scheduler
        scheduler.start();
    }
}

4、运行结果

Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:22:59.009
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:09.002
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:19.001
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:29
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:39.001
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:49
Hello Quartz!:demoJobGroup1.demoJob 2020-10-20T15:23:59

四、其他关键说明

1、任务的启动与关闭

调度器实例化后,它就能够启动,等待执行和关闭。需要注意的是一旦调度器调用 了shutdown 方法关闭后,如果不重新实例化,它就不会启动了。触发器在调度器未启动时,或是终止状态时,都不会被触发。

2、触发器Trigger

  常用的触发器有SimpleTrigger和CronTrigger,SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。CronTrigger通常比SimpleTrigger更有用,如果需要基于日历的概念而不是按照SimpleTrigger的精确指定间隔进行重新启动的作业启动计划。使用CronTrigger,可以指定号时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和“1月份的星期五”。

### 如何在 Spring Boot 中集成和使用 Quartz 定时任务框架 #### 无缝集成与自动配置 通过利用 Spring Boot 的自动配置特性,能够极大地简化 Quartz 的配置过程。这意味着开发者无需手动编写大量的 XML 或 Java 配置文件来初始化 Quartz 调度器和其他组件[^3]。 #### 添加 Maven/Gradle 依赖项 为了使 Spring Boot 应用程序支持 Quartz 功能,在项目的 `pom.xml` 文件中需加入如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 对于 Gradle 用户,则应在 build.gradle 文件内添加相应的内容: ```groovy implementation 'org.springframework.boot:spring-boot-starter-quartz' ``` 此操作确保了所需库被正确引入至工程环境之中[^4]。 #### 编写 Job 类实现特定功能 定义具体的作业类继承自 `Job` 接口并重载其 execute 方法以指定待执行的任务逻辑。下面是一个简单的例子展示怎样创建一个名为 MyJob 的 job 实现打印当前时间戳的功能: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; public class MyJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("Executing my custom task at " + new java.util.Date()); } } ``` 上述代码片段展示了如何构建最基础形式下的定时任务单元——即所谓的 “job”。它会在每次触发时输出一条消息记录下此刻的时间点[^1]。 #### 设置 Trigger 和 Scheduler 来控制任务周期性运行 接下来要做的就是设定何时以及多久一次去调用这些 jobs 。这通常涉及到两个概念:trigger (触发条件) 及 scheduler(调度者). 下面的例子演示了一个基于 cron 表达式的触发机制用于每分钟触发一次前面提到的那个 simple job : ```properties quartz.job.myJob.cron=0 * * ? * * ``` 这段属性声明位于 application.properties(application.yml) 文件里, 并且会告诉 spring boot 自动装配对应的 trigger 到我们的 job 上. 最后一步则是启动整个计划系统使之生效. 这可以通过标注@EnableScheduling 注解于 main Application Class 上完成: ```java @SpringBootApplication @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 至此已经完成了从零开始搭建一套完整的 quartz-scheduled-tasks-on-SpringBoot 流程[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值