Spring boot 集成Quartz,实现Job注入bean
Spring boot 集成Quartz,并实现Job注入bean
1、添加Maven依赖
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>
2、建一个MyJobFactory
要实现Job注入bean必须使用spring-context-support
然后 把其设置为SchedulerFactoryBean 的 JobFactory。其目的是因为我在具体的Job 中 需要Spring 注入一些Service。
所以我们要自定义一个jobfactory, 让其在具体job 类实例化时 使用Spring 的API 来进行依赖注入。
MyJobFactory
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
/*** @author yunfeng* @version V.1.0* @title* @Desc* @create 2018-05-07 22:39**/
@Component
public class MyJobFactory extends AdaptableJobFactory {@Autowiredprivate AutowireCapableBeanFactory capableBeanFactory;@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {// 调用父类的方法 Object jobInstance = super.createJobInstance(bundle);// 进行注入 capableBeanFactory.autowireBean(jobInstance);return jobInstance;}
}
QuartzConfig 声明相关bean依赖
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean; @Configuration
public class QuartzConfig { @Autowired private MyJobFactory myJobFactory; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setJobFactory(myJobFactory); System.out.println("myJobFactory:"+myJobFactory); return schedulerFactoryBean; } @Bean public Scheduler scheduler() { return schedulerFactoryBean().getScheduler(); } }
声明QuartzManager,注入scheduler对quartz Job进行管理
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/*** @author yunfeng* @version V.1.0* @title* @Desc* @create 2018-05-07 22:40**/@Service
public class QuartzManager {@Autowiredprivate Scheduler scheduler;/*** 功能: 添加一个定时任务* @param jobName 任务名* @param jobGroupName 任务组名* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @param jobClass 任务的类类型 eg:TimedMassJob.class* @param cron 时间设置 表达式,参考quartz说明文档* @param objects 可变参数需要进行传参的值*/public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,Class jobClass, String cron, Object... objects) {try {// 任务名,任务组,任务执行类JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();System.out.println("jobDetail.getKey:"+jobDetail.getKey());// 触发器if (objects != null) {for (int i = 0; i < objects.length; i++) {// 该数据可以通过Job中的JobDataMap dataMap =// context.getJobDetail().getJobDataMap();来进行参数传递值jobDetail.getJobDataMap().put("data" + (i + 1), objects[i]);}}TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器名,触发器组triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 触发器时间设定triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 创建Trigger对象CronTrigger trigger = (CronTrigger) triggerBuilder.build();// 调度容器设置JobDetail和Triggerscheduler.scheduleJob(jobDetail, trigger);// 启动if (!scheduler.isShutdown()) {scheduler.start();}} catch (Exception e) {throw new RuntimeException(e);}}/*** 功能:修改一个任务的触发时间** @param jobName* @param jobGroupName* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @param cron 时间设置,参考quartz说明文档*/public void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName,String cron) {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(cron)) {// 触发器TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器名,触发器组triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 触发器时间设定triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 创建Trigger对象trigger = (CronTrigger) triggerBuilder.build();// 方式一 :修改一个任务的触发时间scheduler.rescheduleJob(triggerKey, trigger);}} catch (Exception e) {throw new RuntimeException(e);}}/*** 功能: 移除一个任务** @param jobName* @param jobGroupName* @param triggerName* @param triggerGroupName*/public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);// 停止触发器scheduler.pauseTrigger(triggerKey);// 移除触发器scheduler.unscheduleJob(triggerKey);// 删除任务scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));System.out.println("removeJob:"+JobKey.jobKey(jobName));} catch (Exception e) {throw new RuntimeException(e);}}/**** 功能:启动所有定时任务*/public void startJobs() {try {scheduler.start();} catch (Exception e) {throw new RuntimeException(e);}}/*** 功能:关闭所有定时任务*/public void shutdownJobs() {try {if (!scheduler.isShutdown()) {scheduler.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}
}
创建一个测试Job
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired; public class TestJob implements Job { @Autowired private TestMapper testMapper; @Override public void execute(JobExecutionContext context) throws JobExecutionException { String jobName = context.getJobDetail().getKey().toString().substring(8); System.out.println(jobName+"定时任务开启.."); testMapper.test(jobName); System.out.println(jobName+"定时任务结束.."); } }
3、测试添加Job实现注入
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/citask")
public class TestController {@AutowiredQuartzManager quartzManager;@RequestMapping(value = "/test")public String test(@RequestParam String content){String jobName = "动态任务调度"+content;String jobGroupName = "任务组名";String triggerName = "触发器名"+content;String triggerGroupName = "触发器组名";String time = "*/5 * * * * ?";quartzManager.addJob(jobName,jobGroupName,triggerName,triggerGroupName, TestJob.class,time);return content;}
}
Spring boot 集成Quartz,实现Job注入bean相关推荐
- Spring Boot集成Quartz动态实现数据库任务
1. Quartz简介 1.1. 什么是Quartz Quartz是一个开源的任务调度框架.作用是基于定时.定期的策略来执行任务. 它是OpenSymphony开源组织在Job scheduling领 ...
- Spring Boot集成Quartz注入Spring管理的类
摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...
- mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务
什么是quartz? Quartz是一个完全由 Java 编写的开源任务调度框架. 我们经常会遇到一些问题: 想每个月27号,提醒信用卡还款: 想每隔1小时,提醒一下,累了,站起来活动一下: 想每个月 ...
- spring boot集成Quartz实现定时任务
简介 Quartz是一款功能强大的任务调度器,Quartz有两个比较核心的组件:Job 和 Trigger. Quartz的三个基本要素 Scheduler:调度器,所有的调度都是由它来控制. Tri ...
- Spring Boot 集成 Quartz
1.美图 2.概述 在项⽬开发中,经常需要定时任务来帮助我们来做一些内容,⽐如定时派息.跑批对账.业务监控等.Spring Boot 体系中现在有两种⽅案可以选择,第⼀种是 Spring Boot 内 ...
- Spring Boot 集成Quartz
1:在项目的pom文件添加quartz依赖 <!-- quartz定时任务 --> <dependency><groupId>org.springframework ...
- spring boot集成quartz scheduler
工具.版本 开发工具:IntelliJ IDEA JDK:1.8 spring-boot:2.5.6(事例使用,可根据自己版本调整) maven:3.6.3 依赖jar <dependency& ...
- 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题
为什么80%的码农都做不了架构师?>>> 如题,最近使用spring boot集成shiro,在shiroFilter要使用数据库动态给URL赋权限的时候,发现 @Autowi ...
- Spring boot2集成quartz动态任务管理+Web UI
Dynamic Quartz 最近在公司实习,发现公司有一套spring+Quartz的动态任务管理系统.可以使用Web界面进行任务动态的创建.删除.停止.运行和修改.刚好最近在学习spring ...
- Spring Boot集成Jasypt安全框架
Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...
最新文章
- 关于学习Mongodb的几篇文章
- python3.7 6如何安装-centos安装python3.7
- FastDFS 安装步骤(ubuntu)
- linux 的功能,Linux的主要功能
- vue 点击div 获取位置_Vue中组件之间8种通信方式,值得收藏
- centos下部署tomcat详解
- 云计算具有什么平台_究竟什么是云计算?
- PHP不读取Excel空行,phpexcel中遇到空单元格不跳过
- 接口测试--ssl证书问题
- 错误及原因推测:sysdeps/x86_64/multiarch/strstr-sse2-unaligned.S: 没有那个文件或目录
- coreldraw x4忽略视图样式补丁_Coreldraw x4忽略颜色样式和视图样式补丁
- 新中大软件显示无法连接服务器,新中大 - Guoy
- Win10 IPv6 远程桌面连接(小米路由器)
- 如何摆脱NAS中的振动和噪音
- ds310服务器运行灯不亮,【群晖 DS218+ 2盘位 NAS网络存储服务器外观设计】按键|usb2.0口|电源键|指示灯|风扇_摘要频道_什么值得买...
- Arduino(五)——呼吸灯
- AURIX TC397 CAN MCMCAN
- 【知识小集】☞Excel之VBA编程语句集300句
- ReentrantLock 锁详解
- 下载RoboWare Studio官网登录不上去
热门文章
- 手机号归属地能改吗?支付及通讯行业怎么看?
- 迅雷9下载down.php,迅雷9-文件下载工具-迅雷9下载 V9.1.49.1060测试版-完美下载
- Oracle JDK | 迅雷内置浏览器解决 Java 下载需要登录 不能直接复制链接 直接下载慢
- [集训队作业2018]uoj 449 喂鸽子 - min-max容斥 - dp - NTT
- SEO基础知识简介(一)
- FormData兼容性问题
- 记录:Base64编码步骤详解
- GaRy-Liang的linux成长日记12-算术预算与测试
- css3d转换_使用CSS 3D转换创建网页电影摄影
- iOS9 In-house 未受信任的企业级开发者