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.增加依赖
<!--quartz-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!-- 该依赖必加,里面有sping对schedule的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
2.增加conf
package
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; /**
* @program:
* @description: 定时任务创建job,通过注入Scheduler对任务进行操作
* @author: DZ
* @create: 2019-10-19 18:28
**/
@Service
public class QuartzConf {
private static final String JOB_GROUP = "job_group";
private static final String TRIGGER_GROUP = "trigger_group";
@Autowired
private Scheduler scheduler; /**
* 创建定时任务
*定义相应的任务(JobDetial)和触发器(trigger),并将其加到一个执行日程(Scheduler)中,并通过监听器启动日程。
* @param jobDetailName
* @param cronExpression
* @param jobClass
* @throws SchedulerException
*/
public void createScheduleJob(String jobDetailName, String cronExpression, Class<? extends Job> jobClass) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity("task_" + jobDetailName, JOB_GROUP).storeDurably().requestRecovery().build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("task_" + jobDetailName, TRIGGER_GROUP).withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
}
}
3.增加过滤器
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent; import java.util.UUID; /**
* @program:
* @description: 启动监听去初始化Quartz
* @author: DZ
* @create: 2019-10-19 18:32
**/
@Slf4j
@Configuration
public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private QuartzConf quartzConf; /* 时间格式:
* * * * * * *
[秒] [分] [小时] [日] [月] [周] [年]*/ /**
* 初始启动quartz
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
try {
log.info("任务开始启动...");
quartzConf.createScheduleJob("TestTask", "*/30 * * * * ?", TestTask.class);
log.info("任务已经启动...");
} catch (SchedulerException e) {
log.error("定时任务启动失败", e);
}
}
}
如果整个项目就一个定时任务,其实也不需要过滤器,直接将定时任务的类名写在cong中即可。如果有多个定时任务,定义多个trigger和job也可以。这样代码的冗余度比较高
此监听器的作用在于:项目启动的时候,监听器将所有的定时任务注册到日程中,相当于开启定时任务。从而做到了只需要定义一套trigger和job就可以写多个定时任务。
4.写定时任务
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.MDC; import java.util.UUID; /**
* @program:
* @description: 测试定时任务
* @author: DZ
* @create: 2019-10-19 18:49
**/
@Slf4j
public class TestTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobKey key = jobExecutionContext.getJobDetail().getKey();
// todo 业务逻辑
log.info("----------" + key + "任务执行中,currentTime:" + DateUtil.getCurrentDate());
}
}
这个位置除了实现Job接口外,还可以继承QuartzJobBean类,其实QuartzJobBean也是Job的子类,只不过对部分参数进行了初始化
启动服务,查看结果

此外,如果不对定时任务做线程池的配置,那么默认是10个线程,这里也可以增加对线程池的配置,在yml中增加属性:
Spring:
# quartz定时器配置
quartz:
properties:
org:
quartz:
scheduler:
instanceName: quartzScheduler
instanceId: AUTO
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
此时就是定义了20个线程
Spring Boot 入门(九):集成Quartz定时任务的更多相关文章
- Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存
本片文章续<Spring Boot 入门(九):集成Quartz定时任务>.本文主要基于redis实现了mybatis二级缓存.较redis缓存,mybaits自带缓存存在缺点(自行谷歌) ...
- Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图
本篇文章是接着Spring Boot 入门(五):集成 AOP 进行日志管理写的,主要集成了树形图,在部门列表或者权限列表中,树形图经常被用上.主要是根据相应的 API 凭借 html 字符串 1.t ...
- Spring Boot 入门(五):集成 AOP 进行日志管理
本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页 ...
- Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理
本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 ...
- Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示
关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了S ...
- Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件
上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...
- Spring Boot 入门(七):集成 swagger2
本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swa ...
- Spring Boot 入门(八):集成RabbitMQ消息队列
本片文章续<Spring Boot 入门(七):集成 swagger2>,关于RabbitMQ的介绍请参考<java基础(六):RabbitMQ 入门> 1.增加依赖 < ...
- Spring Boot 入门(十一):集成 WebSocket, 实时显示系统日志
以前面的博客为基础,最近一篇为Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存.本篇博客主要介绍了Spring Boot集成 Web Socket进行日志的推送, ...
随机推荐
- k8s概念入门
k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个 ...
- C仿黑白棋版XO棋
两位玩家轮流在棋盘上放置不同颜色的棋子,一位玩家使用黑子,另一位使用白子,棋盘是一个偶数正方形. 只能将一个棋子放在对手的棋子旁边,使对手在水平.垂直.对角线方向上的棋子变成自己的棋子,游戏结束时,棋 ...
- 生成模型 VS 判别模型 (含义、区别、对应经典算法)
从概率分布的角度考虑,对于一堆样本数据,每个均有特征Xi对应分类标记yi. 生成模型:学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率,然后求条件概率分布.能够学习到数据生成的机制 ...
- 10分钟彻底理解Redis持久化和主从复制
在这篇文章,我们一起了解 Redis 使用中非常重要的两个机制:Reids 持久化和主从复制. 什么是 Redis 持久化? Redis 作为一个键值对内存数据库(NoSQL),数据都存储在内存当中, ...
- 更换python版本后出现 No module named "apt_pkg"
本文链接:https://blog.csdn.net/jaket5219999/article/details/78464310 $ sudo apt-get remove --purge pytho ...
- Linux Nginx naxsi
nginx naxsi 模块 - 简书https://www.jianshu.com/p/8492da04b3ba naxsi compile · nbs-system/naxsi Wikihttps ...
- Flutter异步编程 http网络请求数据
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as ht ...
- Spring cloud微服务安全实战-3-7API安全机制之数据加密
这一节来聊一下密码的加密. 加密盐,为了避免两个相同的面加密出来的密文是一样的,每个人的盐不一样, 首先引入工具包,lambdaworks <!-- https://mvnrepository. ...
- 果卿居士-《四种清净明诲》之不淫欲 -------------------------------------------------------------------------------- (转自学佛网:http://www.xuefo.net/nr/article19/186541.html)
“如不断淫”, “阿难,如不断淫,修禅定者,如蒸砂石.欲其成饭.经百千劫.只名热砂.何以故.此非饭本.砂石成故.” 阿难啊,如果这个修行的人,最后不能断除淫欲,包括夫妻之间的淫欲,如果你不能断除这个欲 ...
- CSS Position定位过多是否会影响浏览器渲染速度
一直有个传说就是页面里的Position多了会影响浏览器渲染速度,今天做个测试看看结果如何. 检验的方法: 动态创建一定数量的div > 开始计算时间 > 导入css文件渲染 > o ...