Spring 整合 Quartz框架(定时任务)
Maven 无法下载 Quartz 依赖,去官网下载 http://www.quartz-scheduler.org/downloads/
Quartz 官方手册:https://www.w3cschool.cn/quartz_doc/
需要注意
spring3.1以下的版本必须使用 quartz1.x 系列,3.1以上的版本才支持quartz2.x,不然会出错。
1、原因:spring 对 quartz 的支持实现,org.springframework.scheduling.quartz.CronTriggerBean 继承了 org.quartz.CronTrigger
在 quartz1.x 系列中 org.quartz.CronTrigger 是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器。
1、做个小笔记,Quartz 对任务调度的领域问题进行了高度的抽象
1、提出了调度器、任务、触发器 这3个核心的概念
2、Job:是一个接口,只有一个方法 void execute(JobExecutionContext context),实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。
Job运行时的信息保存在JobDatMap 实例中
3、JobDetail:Quartz 在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接受一个Job实现类,以便运行时通过
nweInstance() 的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其他相关的静态信息,如Job名字、描述、关联监听器等信息,
JobDetail 承担了这一角色。
通过该类的构造函数可以更具体的了解它的作用:JobDetail( java.lang.String name , java.lang.String group , java.lang.Class jobClass)
该构造函数要去指定Job的实现类、以及任务在Scheduler 中的组名 和 Job 名称
4、Trigger:是一个类,描述触发了Job执行的时间触发规则。主要有 SimpleTrigger 和 CronTrigger 这两个子类
当仅需 触发 一次 或者 固定时间间隔周期执行,SimpleTrigger 是最合适的选择
CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案,如 每天早上9:00执行,周一、周三中午12:00执行等。
5、Calendar:org.quartz.Calendar 和 java.util.Calendar 不同,它是一些日历特定时间点的集合
(可以简单的将org.quartz.Calendar 看作 java.util.Calendar 的集合,java.util.Calendar 代表一个日历时间点)
一个 Trigger 可以和多个Calendar 关联,以便排除或包含某些时间点。
假设,我们安排每周星期一早上 10:00 执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要Trigger触发机制
的基础上使用Calendar 进行定点排除,针对不同时间段类型,Quartz在org.quartz.impl.calendar包下提供了若干个Calendar的实现类,
如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分别针对每年、每月和每周进行定义。
6、Scheduler:代表一个Quartz的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在Schedule 中拥有各自
的组及名称,组及名称是Scheduler 查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组合名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)
Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger 和 JobDetail。
Scheduler 可以将Trigger绑定到 某一个 JobDetail 中,当Trigger触发时,对应的Job就被执行,一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。
可以通过SchedulerFactory 创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put() 和 getXxx() 的方法。可以通过Scheduler.getContext() 获取对应的SchedulerContext实例。
7、ThreadPool:Scheduler 使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率
8、Job有一个StatefulJob子接口,代表有状态的任务,改接口是一个没有方法的标签接口,其目的是让quartz知道任务的类型,以便采用不同的执行方案
嘿嘿,(*^▽^*) 直接抄大佬的总结,谢谢大佬的分享 https://blog.csdn.net/justdoit_potato/article/details/72841157
Spring 2.5 整合 quartz 1.7.3
我的环境:jdk7、quartz1.7.3 、spring-web 3.0.5 、spring 2.5

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
由于某些原因.......,我就只贴工具类了...................................................................... 0.0
ScheduleJob.java
package com.zh.oukele.quartz3.entity;
/**
* CREATE BY OUKELE
* CREATE TIME:2019/12/16 - 10:34
*/
public class ScheduleJob {
private String id;
private String jobName;
private String groupName;
private String triggerName;
private String triggerGroupName;
private String jobStatus;
private Boolean concurrent;
private String cron;
private String beanClass;
private String methodName;
private String jobData;
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public String getJobStatus() {
return jobStatus;
}
public void setJobStatus(String jobStatus) {
this.jobStatus = jobStatus;
}
public Boolean getConcurrent() {
return concurrent;
}
public void setConcurrent(Boolean concurrent) {
this.concurrent = concurrent;
}
public String getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
public String getBeanClass() {
return beanClass;
}
public void setBeanClass(String beanClass) {
this.beanClass = beanClass;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getJobData() {
return jobData;
}
public void setJobData(String jobData) {
this.jobData = jobData;
}
public String getTriggerName() {
return triggerName;
}
public void setTriggerName(String triggerName) {
this.triggerName = triggerName;
}
public String getTriggerGroupName() {
return triggerGroupName;
}
public void setTriggerGroupName(String triggerGroupName) {
this.triggerGroupName = triggerGroupName;
}
@Override
public String toString() {
return "ScheduleJob{" +
"id='" + id + '\'' +
", jobName='" + jobName + '\'' +
", groupName='" + groupName + '\'' +
", triggerName='" + triggerName + '\'' +
", triggerGroupName='" + triggerGroupName + '\'' +
", jobStatus='" + jobStatus + '\'' +
", concurrent=" + concurrent +
", cron='" + cron + '\'' +
", beanClass='" + beanClass + '\'' +
", methodName='" + methodName + '\'' +
", jobData='" + jobData + '\'' +
'}';
}
}
InitQuartzJob.java
package com.zh.oukele.quartz3;
import com.zh.oukele.quartz3.entity.ScheduleJob;
import com.zh.oukele.quartz3.util.QuartzJobFactory;
import org.quartz.*;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.ArrayList;
import java.util.List;
/**
* CREATE BY OUKELE
* CREATE TIME:2019/12/16 - 9:59
*/
public class InitQuartzJob implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static Scheduler scheduler = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if( null == this.applicationContext ){
this.applicationContext = applicationContext;
}
}
public void init(){
scheduler = (Scheduler) applicationContext.getBean("schedulerFactoryBean");
try {
System.out.println( "schedule - init " + scheduler.getSchedulerName());
} catch (SchedulerException e) {
e.printStackTrace();
}
// 模拟数据库
ScheduleJob scheduleJob = new ScheduleJob();
scheduleJob.setId("");
scheduleJob.setJobName("myJob");
scheduleJob.setGroupName("myJobGroup1");
scheduleJob.setTriggerName("myTrigger");
scheduleJob.setTriggerGroupName("myTriggerGroup1");
scheduleJob.setCron("0/5 * * * * ?");
scheduleJob.setJobStatus("1");
scheduleJob.setConcurrent(true);
// scheduleJob.setJobData("测试内容.....1");
scheduleJob.setMethodName("apple");
scheduleJob.setBeanClass("com.zh.oukele.quartz3.AppleTask");
try {
addJob(scheduleJob);
} catch (Exception e) {
e.printStackTrace();
System.out.println("任务添加失败:" + e.getMessage());
}
}
// 添加任务
public void addJob(ScheduleJob scheduleJob) throws Exception {
Trigger trigger = scheduler.getTrigger(scheduleJob.getTriggerName(), scheduleJob.getTriggerGroupName());
// 新任务
if( null == trigger ){
Class clazz = scheduleJob.getConcurrent()? QuartzJobFactory.class : null;
// 描述任务清单
JobDetail jobDetail = new JobDetail(scheduleJob.getJobName(),scheduleJob.getGroupName(),clazz);
jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);
// cron 触发器
CronTrigger cronTrigger = new CronTrigger(scheduleJob.getTriggerName(),scheduleJob.getTriggerGroupName(),scheduleJob.getJobName(),scheduleJob.getGroupName());
cronTrigger.setCronExpression(scheduleJob.getCron());
// 将任务 注册到 scheduler 中
scheduler.scheduleJob(jobDetail,cronTrigger);
}else {
// Trigger已存在,那么更新相应的定时设置
CronTrigger updateTrigger = (CronTrigger) trigger;
updateTrigger.setCronExpression(scheduleJob.getCron());
scheduler.rescheduleJob(scheduleJob.getTriggerName(),scheduleJob.getTriggerGroupName(),updateTrigger);
}
}
}
QuartzJobFactory.java
package com.zh.oukele.quartz3.util;
import com.zh.oukele.quartz3.entity.ScheduleJob;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* CREATE BY OUKELE
* CREATE TIME:2019/12/16 - 11:17
* 计划任务执行处 无状态
*/
public class QuartzJobFactory implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
ScheduleJob scheduleJob = (ScheduleJob) jobExecutionContext.getMergedJobDataMap().get("scheduleJob");
TaskUtil.invokMethod(scheduleJob);
}
}
TaskUtil.java
package com.zh.oukele.quartz3.util;
import com.zh.oukele.quartz3.entity.ScheduleJob;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
/**
* CREATE BY OUKELE
* CREATE TIME:2019/12/16 - 11:43
*/
public class TaskUtil implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory; // Spring应用上下文环境
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
TaskUtil.beanFactory = configurableListableBeanFactory;
}
public static void invokMethod(ScheduleJob scheduleJob){
Object object = null;
Class clazz = null;
boolean flag = true;
if (StringUtils.isNotBlank(scheduleJob.getId())) {
object = beanFactory.getBean(scheduleJob.getId());
}
if( object == null && StringUtils.isNotBlank(scheduleJob.getBeanClass()) ){
try {
clazz = Class.forName(scheduleJob.getBeanClass());
object = clazz.newInstance();
} catch (Exception e) {
flag = false;
e.printStackTrace();
System.out.println("未找到"+scheduleJob.getBeanClass()+"对应的class," + new Date());
}
}
if( object == null ){
flag = false;
System.out.println("任务名称 = [" + scheduleJob.getJobName()+ "]---------------未启动成功,请检查是否配置正确!!!");
return;
}
clazz = object.getClass();
Method method = null;
try {
if( StringUtils.isBlank(scheduleJob.getJobData()) ){
method = clazz.getDeclaredMethod(scheduleJob.getMethodName());
}else {
method = clazz.getDeclaredMethod(scheduleJob.getMethodName(),new Class[]{String.class});
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
flag = false;
System.out.println("任务名称 = [" + scheduleJob.getJobName() + "] [class = "+ scheduleJob.getBeanClass() +"],未找到方法名为[ "+ scheduleJob.getMethodName() +" ] 的方法!!");
}
if( method != null ){
try {
if( StringUtils.isBlank(scheduleJob.getJobData()) ){
method.invoke(object);
}else {
method.invoke(object,scheduleJob.getJobData());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
System.out.println("未找到"+scheduleJob.getBeanClass()+"类下"+scheduleJob.getMethodName()+"对应的方法参数设置错误");
} catch (InvocationTargetException e) {
e.printStackTrace();
System.out.println("未找到"+scheduleJob.getBeanClass()+"类下"+scheduleJob.getMethodName()+"对应的方法参数设置错误");
}
}
if( flag ){
System.out.println("任务名称 = [" + scheduleJob.getJobName() + "]----------启动成功");
}
}
}
AppleTask.java
package com.zh.oukele.quartz3;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* CREATE BY OUKELE
* CREATE TIME:2019/12/16 - 10:26
*/
public class AppleTask {
public void apple(){
System.out.println("-------------------------------" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()));
}
}
xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="false">
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
<bean id="initQuartzJob" class="com.zh.oukele.quartz3.InitQuartzJob" init-method="init"
lazy-init="false"/>
</beans>
启动的效果....
每5秒执行一次( 然后 ..... 这个定时任务的停、删、改.... 有时间再放上来... )

Spring + quartz 2.x.x 版本的....................... 有时间 再贴出来...... 感觉好乱.........
Spring 整合 Quartz框架(定时任务)的更多相关文章
- spring整合quartz框架
spring整合quartz: 网上也有很多教程,好多都是基于配置方式,我们使用当然怎么简单就怎么用,所以这里介绍基于注解方式整合quartz.前提:你需要有一个能运行的web项目. 1.引依赖: & ...
- spring整合Quartz框架过程,大家可以参考下
这篇文章详细介绍了spring集成quartz框架流程,通过示例代码进行了详细说明,对学习或任务有参考学习价值,并可供需要的朋友参考. 1.quartz框架简介(m.0831jl.com) quart ...
- 【淘淘】Spring整合Quartz框架
我在外面工作实习的时候,我们做的项目是一个日报子系统,也就是定时定点为公司生成一些报表数据还有一些数据反馈.这时候我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.当时,我做 ...
- Spring整合quartz框架实现任务定时调度
1. 首先需要引入需要的jar包,如上图所示. 2. 编写需要定时调度的测试类: package com.jp.task; import java.util.Date; public class T ...
- spring整合quartz实现定时任务
需求:spring+mybatis框架已经搭建好,需要实现一个定时任务. 一:导出相应的jar包 quartz-all-1.6.5.jar获取quartz-alll-1.6.6.jar spring- ...
- Spring整合Quartz分布式定时任务
概述虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部 ...
- spring整合quartz时间任务调度框架
spring整合quartz框架 1.创建maven工程 2.导入jar包(pom.xml) <dependencies> <dependency> <groupId&g ...
- 使用Spring整合Quartz轻松完成定时任务
一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境) 转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...
随机推荐
- 《构建之法》——GitHub和Visual Studio的基础使用
git地址 https://github.com/microwangwei git用户名 microwangwei 学号后五位 62214 博客地址 https://www.cnblogs.com/w ...
- java后端通过request对象获取请求的ip地址工具类
package cn.zgjkw.battalion.util; import org.apache.log4j.Logger; import javax.servlet.http.HttpServl ...
- WDL学习笔记
WDL是什么? WDL是由Broad Institute开发的一种流程开发语言,全称workflow description language,官方链接如下:https://software.broa ...
- quartz定时任务存储
今天不聊quartz的概念,像任务bean,触发器,调度器这些随随便便都可以百度到,其中任务bean要实现job接口.对于这些创建生成的定时任务,它可以保存在内存中,重启失效,也可以保存在数据库里重启 ...
- 记一次SQL优化
常见的SQL优化 一.查询优化 1.避免全表扫描 模糊查询前后加%也属于全表扫描 在where子句中对字段进行表达式操作会导致引擎放弃使用索引而进行全表扫描,如: select id from t w ...
- [C++] 非递归实现前中后序遍历二叉树
目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...
- WUSTOJ 1344: still水题(Java)进制转换
题目链接:1344: still水题 Description 送AC,不解释 Input 输入两个整数n和b,b表示该数的进制(包含2.8.16进制,多组数组) Output 输出该整数(10进制,每 ...
- 多进程实现并发服务器(TCP)
前提:基于Linux系统的学习 /*多进程实现并发服务器 父进程任务 1.从未决连接队列中取出请求,建立和客户端的连接,cfd 2.创建子进程 3.close(cfd) 4.负责子进程的收尸工作 子进 ...
- Python开发【第二章】:模块和运算符
一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...