springboot入门:集成quartz定时任务

光头才能强      2022-05-20     648

关键词:

本片文章续《Spring Boot 入门(八):集成RabbitMQ消息队列》,关于Quartz定时任务请参考《Quartz的基本使用之入门(2.3.0版本)

spring boot实现定时任务,除了集成Quartz外,还可以直接使用scheduler注解。使用1个简单的注解就可以完成,为什么还要较为复杂的集成Quartz呢?这里我简单回答下这2中方式的区别,这也是我在项目中为什么要选择Quartz这种方式。

1.scheduler注解方式,一旦定时任务产生异常,那么此定时任务就无法再次启动,意味该定时任务就失效了,而Quartz不会。

2.scheduler注解方式,当前面的定时任务没有完成的时候,无法再次开启定时任务,这说明scheduler注解方式是单线程,而Quartz是多线程,同一定时任务可以并发处理。

3.scheduler注解方式,对于定时的格式很少,只能简单的在注解中配置,很多复杂的定时任务没法完成,而Quartz的格式很丰富,可以配置各种各样的定时任务。

基于上述原因,定时任务应该选择Quartz。

 

1.增加依赖

 1 <!--quartz-->
 2         <dependency>
 3             <groupId>org.quartz-scheduler</groupId>
 4             <artifactId>quartz</artifactId>
 5             <version>2.2.1</version>
 6         </dependency>
 7         <!-- 该依赖必加,里面有sping对schedule的支持 -->
 8         <dependency>
 9             <groupId>org.springframework</groupId>
10             <artifactId>spring-context-support</artifactId>
11         </dependency>

2.增加conf

 1 package 2 
 3 import org.quartz.*;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.stereotype.Service;
 6 
 7 
 8 /**
 9  * @program: 
10  * @description: 定时任务创建job,通过注入Scheduler对任务进行操作
11  * @author: DZ
12  * @create: 2019-10-19 18:28
13  **/
14 @Service
15 public class QuartzConf {
16     private static final String JOB_GROUP = "job_group";
17     private static final String TRIGGER_GROUP = "trigger_group";
18     @Autowired
19     private Scheduler scheduler;
20 
21     /**
22      * 创建定时任务
23      *定义相应的任务(JobDetial)和触发器(trigger),并将其加到一个执行日程(Scheduler)中,并通过监听器启动日程。
24      * @param jobDetailName
25      * @param cronExpression
26      * @param jobClass
27      * @throws SchedulerException
28      */
29     public void createScheduleJob(String jobDetailName, String cronExpression, Class<? extends Job> jobClass) throws SchedulerException {
30         JobDetail jobDetail = JobBuilder.newJob(jobClass)
31                 .withIdentity("task_" + jobDetailName, JOB_GROUP).storeDurably().requestRecovery().build();
32         CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
33         Trigger trigger = TriggerBuilder.newTrigger().withIdentity("task_" + jobDetailName, TRIGGER_GROUP).withSchedule(scheduleBuilder).build();
34         scheduler.scheduleJob(jobDetail, trigger);
35     }
36 }

3.增加过滤器

 6 import lombok.extern.slf4j.Slf4j;
 7 import org.quartz.SchedulerException;
 8 import org.slf4j.MDC;
 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.context.ApplicationListener;
11 import org.springframework.context.annotation.Configuration;
12 import org.springframework.context.event.ContextRefreshedEvent;
13 
14 import java.util.UUID;
15 
16 /**
17  * @program: 
18  * @description: 启动监听去初始化Quartz
19  * @author: DZ
20  * @create: 2019-10-19 18:32
21  **/
22 @Slf4j
23 @Configuration
24 public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent> {
25     @Autowired
26     private QuartzConf quartzConf;
27 
28    /* 时间格式:
29     *    *     *     *    *     *   *
30     [秒] [分] [小时] [日] [月] [周] [年]*/
31 
32     /**
33      * 初始启动quartz
34      */
35     @Override
36     public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
37         try {
38             log.info("任务开始启动...");
39           40             quartzConf.createScheduleJob("TestTask", "*/30 * * * * ?", TestTask.class);
41             log.info("任务已经启动...");
42         } catch (SchedulerException e) {
43             log.error("定时任务启动失败", e);
44         }
45     }
46 }

如果整个项目就一个定时任务,其实也不需要过滤器,直接将定时任务的类名写在cong中即可。如果有多个定时任务,定义多个trigger和job也可以。这样代码的冗余度比较高

此监听器的作用在于:项目启动的时候,监听器将所有的定时任务注册到日程中,相当于开启定时任务。从而做到了只需要定义一套trigger和job就可以写多个定时任务。

4.写定时任务

 1  2 
 3  4 import lombok.extern.slf4j.Slf4j;
 5 import org.quartz.Job;
 6 import org.quartz.JobExecutionContext;
 7 import org.quartz.JobExecutionException;
 8 import org.quartz.JobKey;
 9 import org.slf4j.MDC;
10 
11 import java.util.UUID;
12 
13 /**
14  * @program:
15  * @description: 测试定时任务
16  * @author: DZ
17  * @create: 2019-10-19 18:49
18  **/
19 @Slf4j
20 public class TestTask implements Job {
21     @Override
22     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
23        25         JobKey key = jobExecutionContext.getJobDetail().getKey();
26         // todo 业务逻辑
27         log.info("----------" + key + "任务执行中,currentTime:" + DateUtil.getCurrentDate());
28     }
29 }

 这个位置除了实现Job接口外,还可以继承QuartzJobBean类,其实QuartzJobBean也是Job的子类,只不过对部分参数进行了初始化

启动服务,查看结果

 

 

此外,如果不对定时任务做线程池的配置,那么默认是10个线程,这里也可以增加对线程池的配置,在yml中增加属性:

 1 Spring:  
 2 #  quartz定时器配置
 3   quartz:
 4     properties:
 5       org:
 6         quartz:
 7           scheduler:
 8             instanceName: quartzScheduler
 9             instanceId: AUTO
10           threadPool:
11             class: org.quartz.simpl.SimpleThreadPool
12             threadCount: 20
13             threadPriority: 5
14             threadsInheritContextClassLoaderOfInitializingThread: true

此时就是定义了20个线程

springboot入门定时任务

本文记录在SpringBoot中使用定时任务。  在我们的项目中,经常需要用到定时任务去帮我们做一些事情,比如服务状态监控,业务数据状态的更改等,SpringBoot中实现定时任务有2中方案,一种是自带的,我们只需要加上注解即可... 查看详情

springboot集成quartz动态定时任务

SpringBoot自带schedule沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务注意在程序启动的时候加上@EnableScheduling@Scheduled(cron="0/5****?")publicvoidjob()System.out.println("每五秒执行一次");为什么要... 查看详情

springboot集成quartz动态定时任务

SpringBoot自带schedule沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务注意在程序启动的时候加上@EnableScheduling@Scheduled(cron="0/5****?")publicvoidjob()System.out.println("每五秒执行一次");为什么要... 查看详情

springboot集成quartz开始正常执行,一段时间后任务不执行

参考技术APS:最近项目需要定时进行数据汇总,引入了Quartz之后发现,开始的时候任务可以执行,一段时间后后台看不到报错,但是任务却不执行。 查看详情

springboot结合xxl-job实现定时任务(代码片段)

...文章工具比MyBatisGenerator更强大的代码生成器ORM框架选型SpringBoot项目基础设施搭建SpringBoot集成Mybatis项目实操SpringBoot集成MybatisPlus项目实操SpringBoot集成SpringDataJPA项目实操数据库变更管理数据库变更管理:LiquibaseorFlywaySpringBoot... 查看详情

springboot集成quartz集群(代码片段)

为什么要使用Quzrtz集群  在项目进行集群部署时,如果业务在执行中存在互斥关系,没有对定时任务进行统一管理,就会引起业务的多次执行,不能满足业务要求。这时就需要对任务进行管理,要保证一笔业务在所有的集群环... 查看详情

springboot入门:集成redis哨兵模式,实现mybatis二级缓存

本片文章续《SpringBoot入门(九):集成Quartz定时任务》。本文主要基于redis实现了mybatis二级缓存。较redis缓存,mybaits自带缓存存在缺点(自行谷歌)。本文是基于docker安装redis主从模式。1.redis安装(1)首先安装redis集群模式,... 查看详情

springboot集成quartz@autowired为null

...,@Autowired为null。原因是quartz自己管理的Job对象,没有被SpringBoot管理,解决办法就是托管给SpringBoot管理。没经过多方查找资料,找的了一个简单的解决方法。如下添加Pom依赖定义执行的job 查看详情

springboot2.1.1.release集成quartz

SpringBoot2.1.1.RELEASE集成quartzhttp://www.qchcloud.cn/system/article/show/70依赖配置:<!--定时任务--><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</arti 查看详情

分布式定时任务调度框架-quartz学习及实战记录笔记

...系3.Trigger触发器的介绍4.Quartz配置资源介绍5.Quartz监听器6.SpringBoot整合Quartz实现动态的创建或删除定时任务并将定时调度任务持久化到MySQL以及Quartz集群配置7.分布式定时任务调度框架学习与实战记录完整篇 查看详情

分布式定时任务调度框架-quartz学习及实战记录笔记

...系3.Trigger触发器的介绍4.Quartz配置资源介绍5.Quartz监听器6.SpringBoot整合Quartz实现动态的创建或删除定时任务并将定时调度任务持久化到MySQL以及Quartz集群配置7.分布式定时任务调度框架学习与实战记录完整篇 查看详情

springboot集成quartz实现任务调度

...模式组件模式链式写法体系结构调度器任务触发器架构图springbootquartzpom配置<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</a 查看详情

spring集成quartz定时任务

1.导入jar包2.配置applicationContext.xml文件<!--任务调度1--> <!--beanid="simpleJob"class="com.shprj.quartz.SimpleJob"></bean> <beanid="simpleJobDetail"class=&quo 查看详情

springboot整合quartz集群环境实现动态定时任务配置原

最近做了一个springboot 整合quartz 实现动态定时任务配置,在集群环境下运行的任务。能够对定时任务,动态的进行增删改查,界面效果图如下:   1.在项目中引入jar 2.将需要的表导入数据库 官网上有不... 查看详情

springboot定时任务-什么是elasticjob?如何集成elasticjob实现分布式任务调度?

...ticJob成为ApacheShardingSphere的子项目;本文介绍ElasticJob以及SpringBoot的集成。@pdai知识准备需要对分布式任务的知识体系和Elastic 查看详情

springboot整合quartz实现定时任务

依赖包1<dependency>2<groupId>org.quartz-scheduler</groupId>3<artifactId>quartz</artifactId>4</dependency>5<dependency>6<groupId>org.springframework</gro 查看详情

spring集成quartz实现定时任务

定时器jar引入<dependency>   <groupId>org.quartz-scheduler</groupId>   <artifactId>quartz</artifactId>   <version>2.3.0</v 查看详情

quartz入门(代码片段)

1.Quartz的概念Quartz就是一个基于Java实现的任务调度框架,用于执行你想要执行的任何任务。Quartz是OpenSymphony开源组织在Jobscheduling(定时调度)领域的开源项目,它可以与J2EE和J2SE应用程序相结合也可以单独使用。Q... 查看详情