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相关推荐

  1. Spring Boot集成Quartz动态实现数据库任务

    1. Quartz简介 1.1. 什么是Quartz Quartz是一个开源的任务调度框架.作用是基于定时.定期的策略来执行任务. 它是OpenSymphony开源组织在Job scheduling领 ...

  2. Spring Boot集成Quartz注入Spring管理的类

    摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...

  3. mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务

    什么是quartz? Quartz是一个完全由 Java 编写的开源任务调度框架. 我们经常会遇到一些问题: 想每个月27号,提醒信用卡还款: 想每隔1小时,提醒一下,累了,站起来活动一下: 想每个月 ...

  4. spring boot集成Quartz实现定时任务

    简介 Quartz是一款功能强大的任务调度器,Quartz有两个比较核心的组件:Job 和 Trigger. Quartz的三个基本要素 Scheduler:调度器,所有的调度都是由它来控制. Tri ...

  5. Spring Boot 集成 Quartz

    1.美图 2.概述 在项⽬开发中,经常需要定时任务来帮助我们来做一些内容,⽐如定时派息.跑批对账.业务监控等.Spring Boot 体系中现在有两种⽅案可以选择,第⼀种是 Spring Boot 内 ...

  6. Spring Boot 集成Quartz

    1:在项目的pom文件添加quartz依赖 <!-- quartz定时任务 --> <dependency><groupId>org.springframework ...

  7. spring boot集成quartz scheduler

    工具.版本 开发工具:IntelliJ IDEA JDK:1.8 spring-boot:2.5.6(事例使用,可根据自己版本调整) maven:3.6.3 依赖jar <dependency& ...

  8. 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题

    为什么80%的码农都做不了架构师?>>>    如题,最近使用spring boot集成shiro,在shiroFilter要使用数据库动态给URL赋权限的时候,发现 @Autowi ...

  9. Spring boot2集成quartz动态任务管理+Web UI

    Dynamic Quartz ​ 最近在公司实习,发现公司有一套spring+Quartz的动态任务管理系统.可以使用Web界面进行任务动态的创建.删除.停止.运行和修改.刚好最近在学习spring ...

  10. Spring Boot集成Jasypt安全框架

    Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...

最新文章

  1. 关于学习Mongodb的几篇文章
  2. python3.7 6如何安装-centos安装python3.7
  3. FastDFS 安装步骤(ubuntu)
  4. linux 的功能,Linux的主要功能
  5. vue 点击div 获取位置_Vue中组件之间8种通信方式,值得收藏
  6. centos下部署tomcat详解
  7. 云计算具有什么平台_究竟什么是云计算?
  8. PHP不读取Excel空行,phpexcel中遇到空单元格不跳过
  9. 接口测试--ssl证书问题
  10. 错误及原因推测:sysdeps/x86_64/multiarch/strstr-sse2-unaligned.S: 没有那个文件或目录
  11. coreldraw x4忽略视图样式补丁_Coreldraw x4忽略颜色样式和视图样式补丁
  12. 新中大软件显示无法连接服务器,新中大 - Guoy
  13. Win10 IPv6 远程桌面连接(小米路由器)
  14. 如何摆脱NAS中的振动和噪音
  15. ds310服务器运行灯不亮,【群晖 DS218+ 2盘位 NAS网络存储服务器外观设计】按键|usb2.0口|电源键|指示灯|风扇_摘要频道_什么值得买...
  16. Arduino(五)——呼吸灯
  17. AURIX TC397 CAN MCMCAN
  18. 【知识小集】☞Excel之VBA编程语句集300句
  19. ReentrantLock 锁详解
  20. 下载RoboWare Studio官网登录不上去

热门文章

  1. 手机号归属地能改吗?支付及通讯行业怎么看?
  2. 迅雷9下载down.php,迅雷9-文件下载工具-迅雷9下载 V9.1.49.1060测试版-完美下载
  3. Oracle JDK | 迅雷内置浏览器解决 Java 下载需要登录 不能直接复制链接 直接下载慢
  4. [集训队作业2018]uoj 449 喂鸽子 - min-max容斥 - dp - NTT
  5. SEO基础知识简介(一)
  6. FormData兼容性问题
  7. 记录:Base64编码步骤详解
  8. GaRy-Liang的linux成长日记12-算术预算与测试
  9. css3d转换_使用CSS 3D转换创建网页电影摄影
  10. iOS9 In-house 未受信任的企业级开发者