【Java】【SpringBoot】【Quartz】——3.quartz入门 (spring-boot-starter-quartz)
前面学习了quartz的基础使用:https://www.cnblogs.com/luyj00436/p/18781141
前面引用的依赖为:
1 <dependency> 2 <groupId>org.quartz-scheduler</groupId> 3 <artifactId>quartz</artifactId> 4 <version>2.3.2</version> 5 </dependency>
后续再搜索中,发现对quartz的引用还有。
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-quartz</artifactId> 4 <version>2.7.4</version> 5 </dependency>
在SpringBoot中,可以引用它作为定时器。
使用 org.springframework.boot:spring-boot-starter-quartz 的优势包括:
- 简化配置。
spring-boot-starter-quartz
是Spring Boot官方提供的Starter,自动集成了Quartz核心库(如quartz
和quartz-jobs
),并默认配置了与Spring容器的整合,避免了手动管理依赖版本和复杂配置的问题。 - 自动装配支持。该Starter通过
SchedulerFactoryBean
自动创建Scheduler
实例,并支持通过application.properties
或application.yml
文件配置Quartz属性(如线程池、数据源等),提升开发效率。 - 与Spring生态兼容性。Starter内置了对Spring事务管理的支持,且能直接将Spring容器中的Bean注入到Quartz任务中(通过
AdaptableJobFactory
),确保任务逻辑与Spring Bean的无缝协作。 - 版本一致性。Spring Boot Starter会管理Quartz的版本,避免因版本冲突导致的问题。例如,Spring Boot 3.x默认集成Quartz 2.x,而直接引入原生依赖可能需手动处理版本适配。
接下来,重新学习quartz的引用。
入门使用
新建SpringBoot项目,添加必要的依赖。引入依赖值。这里version与引用的SpringBoot版本一致。
引入依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-quartz</artifactId> 4 <version>2.7.4</version> 5 </dependency>
添加Job任务。
定义一个需要定时调度的任务
1 @PersistJobDataAfterExecution // 支持持久化 2 @DisallowConcurrentExecution // 禁止并发执行同一任务 3 public class HelloQuartz implements Job { 4 /** 5 * 测试任务 6 * @param jobExecutionContext 7 * @throws JobExecutionException 8 */ 9 @Override 10 public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { 11 // 获取JobDetail 12 JobDetail jobDetail = jobExecutionContext.getJobDetail(); 13 JobDataMap jobDataMap = jobDetail.getJobDataMap(); 14 Integer count = jobDataMap.getInt("count"); 15 // 输出结果 16 System.out.println("[" + jobDetail.getKey().getGroup() +"][" + jobDetail.getKey().getName() +"][" +count + "]:" + LocalDateTime.now() ); 17 // 增加次数 18 jobDataMap.put("count",count + 1); // 增加次数 19 } 20 }
配置任务和定时器
1 @Configuration 2 public class QuartzConfig { 3 /** 4 * 设置一个任务1 5 * @return 6 * @throws SchedulerException 7 */ 8 @Bean 9 public JobDetail jobDetail() throws SchedulerException { 10 JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class) 11 .withIdentity("MyJob","group1") 12 .usingJobData("count",1) // 共享初始化数据 13 .storeDurably() // 设置当前任务支持持久化 14 .build(); 15 return jobDetail; 16 } 17 18 /** 19 * 定义触发器1Q 20 * @return 21 * @throws SchedulerException 22 */ 23 @Bean 24 public Trigger trigger() throws SchedulerException { 25 Trigger trigger = TriggerBuilder.newTrigger() 26 .forJob(jobDetail()) // 关联任务1(JobDetail) 27 .withIdentity("MyTrigger","group1") 28 .startNow() // 触发器开始时间 29 .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) // Corn表达式,每5秒执行一次 30 .build(); 31 return trigger; 32 } 33 }
配置文件
1 spring: 2 quartz: 3 job-store-type: memory # 使用内存存储(默认) 4 properties: 5 org.quartz.threadPool.threadCount: 5 # 线程池大小
然后启动任务,任务可以自动调用。
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。