Spring Boot 入门(九):集成Quartz定时任务

本片文章续《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的子类,只不过对部分参数进行了初始化

原文地址:https://www.cnblogs.com/dz-boss/p/11729505.html

时间: 2024-08-10 21:28:47

Spring Boot 入门(九):集成Quartz定时任务的相关文章

Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybatis和pagehelper 关于mybatis和pagehelper的介绍,可以自行博客,网上很多类似的博客,这里,我直接上代码和项目搭建教程. 1.配置文件:在配置文件application.yml中配置MySql数据库连接池和Mybatis扫描包以及PageHelper分页插件 1 mybati

Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了SpringBoot如何集成Mybatis和Pagehelper,但是没有做出实际的范例,本篇博客是连接上一篇写的.通过AdminLTE前端框架,利用DataTable和PageHelper进行分页显示,通过对用户列表的增删改查操作,演示DataTable和PageHelper的使用. (1)Admi

Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理

本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 PageHelper 进行分页显示.按照前面的博客,已经可以搭建一个简单的 Spring Boot 系统,本篇博客继续对此系统进行改造,主要集成了 Shiro 权限认证框架,关于 Shiro 部分,在本人之前的博客(认证与Shiro安全框架)有介绍到,这里就不做累赘的介绍. 此系列的博客为实践部分

Spring Boot 入门(五):集成 AOP 进行日志管理

本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页查询,Generator 代码自动生成器,Shiro登录及权限管理.本篇博客主要是集成 AOP 进行日志管理 1.导入 jar 包 1 <!-- aop --> 2 <dependency> 3 <groupId>org.springframework.boot</g

Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图

本篇文章是接着Spring Boot 入门(五):集成 AOP 进行日志管理写的,主要集成了树形图,在部门列表或者权限列表中,树形图经常被用上.主要是根据相应的 API 凭借 html 字符串 1.treetable 1 <link href="/plugins/treeTable/themes/default/treeTable.css" rel="stylesheet" type="text/css" /> 2 <scrip

Spring Boot 入门(八):集成RabbitMQ消息队列

本片文章续<Spring Boot 入门(七):集成 swagger2>,关于RabbitMQ的介绍请参考<java基础(六):RabbitMQ 入门> 1.增加依赖 1 <!--rabbitMq--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-amqp</artifac

Spring Boot 入门(七):集成 swagger2

本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swagger的介绍,自行谷歌.我这里有在网上购买的相关视频资料,有需要可以呼叫我. 1.引入相关依赖 1 <dependency> 2 <groupId>io.springfox</groupId> 3 <artifactId>springfox-swagger2&

Spring Boot 入门(十一):集成 WebSocket, 实时显示系统日志

以前面的博客为基础,最近一篇为Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存.本篇博客主要介绍了Spring Boot集成 Web Socket进行日志的推送,并实时显示在页面上. 1.导入jar包 第一个jar包是websocket的,第二个jar包是关于环形队列的jar包,本案例是通过本地队列存储日志.有条件的话,最好通过中间件存储(eg:redis,mq……).通过本地队列存储日志会存在日志丢失的情况,且日志量太大,会把页面卡死. 1 <!--beg

161103、Spring Boot 入门

Spring Boot 入门 spring Boot是Spring社区较新的一个项目.该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验,让Java开发也能够实现Ruby on Rails那样的生产效率.为Spring生态系统提供了一种固定的.约定优于配置风格的框架. Spring Boot具有如下特性: 为基于Spring的开发提供更快的入门体验 开箱即用,没有代码生成,也无需XML配置.同时也可以修改默认值来满足特定的需求. 提