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进行日志的推送, ...
随机推荐
- Firefox disable search in the address bar
disable search in the address bar Hi oitconz, setting keyword.enabled to false prevents Firefox from ...
- STM32F429的LTDC和DMA2D ***
在阅读了STM32F429的手册之后,对LTDC与DMA2D有了一点认识. STM32F429与之前的系列强大之处就在于增加了LTDC个功能,从手册上看STM32F429的LTDC可以用于驱动1024 ...
- MySQL按日期分组并统计截止当前时间的总数(实例教程)
MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...
- flutter 打开应用的闪屏动画
import 'package:flutter/material.dart'; import 'package:flutter_app/pages/SplashScreen.dart'; void m ...
- flutter 主页面底部导航栏实现以及主题风格设置
import 'package:flutter/material.dart'; import 'package:flutter_app/bottom_navigation_widget.dart'; ...
- Android开发三步骤
产品经理给需求,UI给图片 开发 *写布局文件 *写Java代码 测试
- 【转载】 卷积神经网络(Convolutional Neural Network,CNN)
作者:wuliytTaotao 出处:https://www.cnblogs.com/wuliytTaotao/ 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎 ...
- ISO/IEC 9899:2011 条款6.7.5——对齐说明符
6.7.5 对齐说明符 语法 1.alignment-specifier: _Alignas ( type-name ) _Alignas ( constant-expr ...
- Java Class与反射相关的一些工具类
package com.opslab.util; import org.apache.log4j.Logger; import java.io.File;import java.io.IOExcept ...
- System.getProperties 获取当前的系统属性
getProperties public static Properties getProperties() 确定当前的系统属性. 首先,如果有安全管理器,则不带参数直接调用其 checkProper ...