开发者

SpringBoot3整合Quartz实现定时任务的示例

目录
  • 1. 什么是 Quartz Scheduler?
  • 2. Spring Boot 3 集成 Quartz Scheduler 的优势
  • 3. Spring Boot 3 集成 Quartz 的步骤
    • 3.1 创建 Spring Boot 项目
    • 3.2 添加 Quartz 依赖
    • 3.3 配置 Quartz 属性
    • 3.4 创建一个 Quartz 任务类
    • 3.5 配置任务调度器
    • 3.6 使用 Cron 表达式配置任务
  • 4. 运行应用并查看日志
    • 5. 动态管理 Quartz 任务
      • 6. 总结

        1. 什么是 Quartz Scheduler?

        Quartz 是 Java 平台下的一个强大、灵活的调度库,它支持复杂的任务调度,包括:

        • 简单的任务:按固定频率或延迟执行任务。
        • 基于 Cron 表达式的任务:支持类似于 linux Cron 的表达式,用于定义复杂的定时任务。
        • 持久化任务:支持将任务数据持久化存储,以便在应用程序重启后可以恢复任务状态。

        2. Spring Boot 3 集成 Quartz Scheduler 的优势

        • 无缝集成:通过 Spring Boot 3 的自动配置特性,无需编写复杂的配置即可使用 Quartz。
        • 灵活管理:支持任务的动态添加、暂停、恢复和删除。
        • 扩展性:可以轻松扩展任务调度系统,便于业务逻辑的复杂应用。

        3. Spring Boot 3 集成 Quartz 的步骤

        3.1 创建 Spring Boot 项目

        可以使用 Spring Initializr 创建项目,选择以下依赖:

        • Spring Web
        • Quartz Scheduler

        SpringBoot3整合Quartz实现定时任务的示例

        3.2 添加 Quartz 依赖

        如果使用的是手动创建的项目,可以在 pom.XML 中添加 Quartz 的依赖:

                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-quartz</artifactId>
                <www.devze.com/dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
        

        3.3 配置 Quartz 属性

        在 application.yml 或 application.properties 文件中配置 Quartz 的基本属性,例如任务存储和调度方式。

        以下是 applicatiojavascriptn.yml 配置示例:

        spring:
          application:
            name: spring-boot3-19-quartz
          quartz:
            job-store-type: memory  # 储类型为内存存储
            properties:
              org:
                quartz:
                  threadPool:
                    threadCount: 5  # 配置线程池线程数为 5
                  jobStore:
                    misfireThreshold: 60000  # 设置作业存储的错过触发阈值为 60000 毫秒(1分钟)
        

        这里使用了内存存储方式(job-store-type: memory),也可以根据需要配置数据库存储任务信息。

        3.4 创建一个 Quartz 任务类

        创建一个简单的 Quartz 任务类,需要实现 Job 接口,并重写 execute 方法:

        import org.quartz.Job;
        import org.quartz.JobExecutionContext;
        import org.quartz.JobExecutionException;
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        import org.springframework.stereotype.Component;
        
        @Component
        public class SampleJob implements Job {
        
            private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);
        
            @Override
            public void execute(JobExecutionContext context) throws JobExecutionException {
                logger.info("Executing Sample Job at: " + context.getFireTime());
            }
        }
        

        3.5 配置任务调度器

        在 Spring Boot 3 中,可以通过 @Configuration 创建 Quartz 的调度器,并配置定时任务的触发器(Trigger)和任务详情(JobDetail)。

        import org.quartz.JobBuilder;
        import org.quartz.JobDetail;
        import org.quartz.SimpleScheduleBuilder;
        import org.quartz.Trigger;
        import org.quartz.TriggerBuilder;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        
        @Configuration
        public class QuartzConfig {
        
            @Bean
            public JobDetail sampleJobDetail() {
                return JobBuilder.newJob(SampleJob.class)
                        .withIdentity("sampleJob")
                        .storeDurably()
                        .build();
            }
        
            @Bean
            public Trigger sampleJobTrigger() {
                SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(10)  // 每 10 秒执行一次
                        .repeatForever();
        
                return TriggerBuilder.newTrigger()
                        .forJob(sampleJobDetail())
                        .withIdentity("sampleJobTrigger")
                        .withSchedule(scheduleBuilder)
                        .javascriptbuild();
            }
        }
        
        • sampleJobDetail 方法定义了任务的基本信息,包括任务类和名称。
        • sampleJobTrigger 方法定义了触发器的调度策略,这里设置为每 10 秒执行一次。

        3.6 使用 Cron 表达式配置任务

        除了简单的时间间隔,还可以通过 Cron 表达式实现更灵活的调度。以下示例展示如何使用 Cron 表达式配置任务触发器。

        import org.quartz.CronScheduleBuilder;
        import org.quartz.Trigger;
        import org.quartz.TriggerBuilder;
        
        @Bean
        public Trigger cronJobTrigger() {
            return TriggerBuilder.newTrigger()
                    .forJob(sampleJobDetail())
                    .withIdentity("cronJobTrigger")
                    .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *"))  // 每分钟执行一次
                    .build();
        }
        

        在这个例子中,Cron 表达式 "0 0/1 * 1/1 * ? *" 表示每分钟执行一次任务。

        4. 运行应用并查看日志

        配置完成后,启动 Spring Boot 应用。Quartz Scheduler 会按照配置执行 SampleJob 任务。您可以在控制台中看到日志输出,类似如下:

        2024-11-13T21:07:39.910+08:00  INFO 11984 --- [spring-boot3-18-quartz] [eduler_Worker-4] c.coderjia.boot318quartz.job.SampleJob   : Executing Sample Job at: Wed Nov 13 21:07:39 CST 2024
        

        每 10 秒执行一次效果:

        SpringBoot3整合Quartz实现定时任务的示例

        每分钟执行一次效果:

        SpringBoot3整合Quartz实现定时任务的示例

        5. 动态管理 Quartz 任务

        可以在代码中动态地添加、暂停、恢复和删除任务。例如,以下是动态添加任务的示例:

        package com.coderjia.boot318quartz;
        
        import org.quartz.JobDetail;
        import org.quartz.JobKey;
        import org.quartz.Scheduler;
        import org.编程客栈quartz.SchedulerException;
        import org.quartz.Trigger;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;
        
        /**
         * @author CoderJia
         * @create 2024/11/13 下午 09:25
         * @Description
         **/
        @Service
        public class QuartzService {
        
            private final Scheduler scheduler;
        
            @Autowired
            public QuartzService(Scheduler scheduler) {
                this.scheduler = scheduler;
            }
        
            public void scheduleJob(JobDetail jobDetail, Trigger trigger) {
                try {
                    scheduler.scheduleJob(jobDetail, trigger);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        
            public void pauseJob(String jobName, String jobGroup) {
                try {
                    JobKey jobKey = new JobKey(jobName, jobGroup);
                    scheduler.pauseJob(jobKey);
                    System.out.println("Job paused: " + jobKey);
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
            }
        
            public void resumeJob(String jobName, String jobGroup) {
                try {
                    JobKey jobKey = new JobKey(jobName, jobGroup);
                    scheduler.resumeJob(jobKey);
                    System.out.println("Job resumed: " + jobKey);
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
            }
        
            public void deleteJob(String jobName, String jobGroup) {
                try {
                    JobKey jobKey = new JobKey(jobName, jobGroup);
                    boolean deleted = scheduler.deleteJob(jobKey);
                    if (deleted) {
                        System.out.println("Job deleted: " + jobKey);
                    } else {
              http://www.devze.com          System.out.println("Job not found: " + jobKey);
                    }
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
            }
        }
        

        调用 scheduleJob 方法可以动态地添加新的任务。类似地,使用 scheduler.pauseJob() 和 scheduler.deleteJob() 可以暂停或删除任务。

        6. 总结

        通过将 Quartz 与 Spring Boot 3 结合,我们可以实现强大而灵活的定时任务调度系统。本文介绍了 Quartz 的基本配置和使用方法,包括如何配置任务、触发器,以及使用 Cron 表达式实现复杂的调度策略。

        以上就是SpringBoot3整合Quartz实现定时任务的示例的详细内容,更多关于SpringBoot3 Quartz定时任务的资料请关注编程客栈(www.devze.com)其它相关文章!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜