quartz任务调度框架与spring整合
Quartz是什么?
Quartz 是一种功能丰富的,开放源码的作业调度库,可以在几乎任何Java应用程序集成 - 从最小的独立的应用程序到规模最大电子商务系统。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数 - 作业被定义为标准的Java组件,可以执行几乎任何东西,可以编程让它们执行。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。
通过触发器结合cron表达式,可以实现丰富的执行策略满足生产需求.
maven引入quartz包
<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>
Job
为了更好的与spring
框架整合,以下代码选择继承实现了Job
接口的QuartzJobBean
类
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
*
* @author ***
* email:***@163.com
* @create 2018-04-20 10:33 AM
**/
public class HelloQuartzJob extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello Quartz !!!!");
}
}
executeInternal
方法内部实现用户自定义业务逻辑.
与spring整合
job配置
<bean id="helloQuartzJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.**.xtfx.quarz.**.job.HelloQuartzJob"/>
<!--任务名-->
<property name="name" value="helloQuartzJob"/>
<!--任务描述-->
<property name="description" value="任务描述"/>
<!--任务所属组-->
<property name="group" value="group"/>
<!--任务在没有触发器绑定时不消亡-->
<property name="durability" value="true"/>
</bean>
trigger配置
<bean id="helloQuartzJobCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--任务bean-->
<property name="jobDetail" ref="helloQuartzJob"/>
<!--任务触发条件-->
<property name="cronExpression" value="0 0/30 10-18 * * ?"/>
</bean>
helloQuartzJob任务加入任务调度器
<!--任务总调度器-->
<bean id="stdScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="transactionManager" ref="transactionManagerBusiness"/>
<property name="triggers">
<list>
<ref bean="helloQuartzJobCronTrigger"/>
</list>
</property>
<property name="jobDetails">
<list>
<ref bean="helloQuartzJob"/>
</list>
</property>
</bean>
上述配置包含到spring的配置中后,任务将于每天10:00至19:00每30分钟触发一次.
quartz任务执行方式与参数传递
任务执行
上述job定以后,在quartz中是并发执行的.对于同一个job的多个实例,它们之间是独立运行,即当HelloQuartzJob的实例A还没有执行完毕,此时却到了HelloQuartzJob的下一次触发时间,则会另起一个实例B,也就无法满足当前时刻有且仅有一个任务实例在运行的情况.注解DisallowConcurrentExecution
则可以满足这以需求,它能保证被其注解的类在任意时刻仅有一个实例在运行.
参数传递
对于有些需要像Job实例传入参数的情况,可以通过JobDetailFactoryBean
的jobDataAsMap
属性传入,然后Job在实例化的时候会通过各属性对应的set
方法完成注入,如果没有在Job类中设置属性和属性方法则需要通过一下方式获取相关参数:
// 获取运行参数
JobDataMap map = context.getJobDetail().getJobDataMap();
根据参数名从map
中获取相应的变量.
如果想让同一个Job的下一个实例获取上一个实例的参数则需要完成以下步骤:
- 类顶部加注解
@PersistJobDataAfterExecution
- 上一个任务完成前写入需要被下一个任务获取的变量以及对应的属性值
// 获取运行参数
JobDataMap map = context.getJobDetail().getJobDataMap();
....
....
map.put("times", map.getInt("times") + 1);
整合
基于以上内容修改第一节的HelloQuartzJob,是的其对应实例任意时刻仅有一个在执行,切每次要输出此次是第几次在执行该任务.
job文件
import org.quartz.*;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
*
* @author ***
* email:***@163.com
* @create 2018-04-20 10:33 AM
**/
@PersistJobDataAfterExecution // 数据保持
@DisallowConcurrentExecution // 多个任务不会同时执行
public class HelloQuartzJob extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// 获取运行参数
JobDataMap map = context.getJobDetail().getJobDataMap();
System.out.println("Hello Quartz 第 " + map.getInt("times") + " 执行 !!!");
map.put("times", map.getIntValue("times") + 1);
}
}
配置文件
- job
<bean id="helloQuartzJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.**.xtfx.quarz.**.job.HelloQuartzJob"/>
<!--任务名-->
<property name="name" value="helloQuartzJob"/>
<!--任务描述-->
<property name="description" value="任务描述"/>
<!--任务所属组-->
<property name="group" value="group"/>
<!--任务在没有触发器绑定时不消亡-->
<property name="durability" value="true"/>
<!--输入属性值获取其他bean-->
<property name="jobDataAsMap">
<map>
<entry key="times" value="0"/>
</map>
</property>
</bean>
- trigger
<bean id="helloQuartzJobCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--任务bean-->
<property name="jobDetail" ref="helloQuartzJob"/>
<!--任务触发条件-->
<property name="cronExpression" value="0 0/1 10-18 * * ?"/>
</bean>
- scheduler
<!--任务总调度器-->
<bean id="stdScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="transactionManager" ref="transactionManagerBusiness"/>
<property name="triggers">
<list>
<ref bean="helloQuartzJobCronTrigger"/>
</list>
</property>
<property name="jobDetails">
<list>
<ref bean="helloQuartzJob"/>
</list>
</property>
</bean>
输出结果
开始触发quartz任务!!!!
Hello Quartz 第 0 执行 !!!
Hello Quartz 第 1 执行 !!!
Hello Quartz 第 2 执行 !!!
quartz任务调度框架与spring整合的更多相关文章
- 1、Shiro 安全框架与Spring 整合详解
Apache Shiro 是一个安全认证框架,和 Spring Security 相比,在于他使用了比较简洁易懂的认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存在 ...
- 8 -- 深入使用Spring -- 7...2 MVC框架与Spring整合的思考
8.7.2 MVC 框架与Spring整合的思考 对于一个基于B/S架构的JAVA EE 应用而言,用户请求总是向MVC框架的控制器请求,而当控制器拦截到用户请求后,必须调用业务逻辑组件来处理用户请求 ...
- Maven环境下搭建SSH框架之Spring整合Hibernate
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...
- Mina框架与Spring整合配置文件
Mina框架与Spring的整合事实上非常easy,主要是要弄清楚要注入的属性的名称,进而选择合适的注入方法. 关于Spring的四种注入方法请还有一篇文章:spring依赖注入的四种方式 <? ...
- Maven环境下搭建SSH框架之Spring整合Struts2
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Struts2:2.5.10 Spring:4.3.8.RELEASE 注意:其他版本在某些特性的使用上可能稍微存在差别 2.准备工作 ...
- 从0开始整合SSM框架--2.spring整合mybatis
依赖:<properties> <!-- spring版本号 --> <spring.version>4.1.3.RELEASE</spring.versio ...
- SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本
1.项目基础 项目是基于Spring Boot2.x版本的 2.添加依赖 <!-- quartz依赖 --> <dependency> <groupId>org.s ...
- Quartz —— 任务调度框架
一.Quartz Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 年被 Terracotta 收购,目前是 Terrac ...
- Quartz 任务调度框架之Hello World
0x01 什么是Quartz? Quartz是一个完全由java编写的开源作业调度框架. 0x02 实战Quartz Hello World 创建Maven项目,POM 文件配置如下: <pro ...
随机推荐
- Spring HATEOAS的简单认识
HATEOAS: 超媒体作为应用程序状态引擎(HATEOAS)是REST应用程序体系结构的一个组件,它将其与其他网络应用程序体系结构区分开来. 使用HATEOAS,客户端与网络应用程序交互,其应用程序 ...
- 【POJ 2176】Folding
[原题链接]传送门 [题面大意] 一个字符串,可以将它改写成循环节带括号的形式进行压缩,输出压缩长度最小的字符串. [题解思路] 1.没思路没思路,不知道怎么乱搞,大概就可以想到动态规划. 2.套路区 ...
- 在微信小程序中将获取到的经纬度(经度纬度)转地址(地名)
var QQMapWX = require('qqmap-wx-jssdk') var qqmapsdk = new QQMapWX({ key: '填写你的key' // 必填 }) wx.getL ...
- error_Could not load file or assembly
原文链接 Could you be missing the loaded assembly from your configuration file? Ensure you have somethin ...
- Python绘制温度变化曲线
导入必要的第三方库 from requests import get import matplotlib.pyplot as plt /usr/lib/python3/dist-packages/ma ...
- echarts 角度渐变环形图心得
今天做了一个图,把自己的遇到的问题和体会记录一下,以防忘记 echarts地址 https://gallery.echartsjs.com/editor.html?c=xEPtLLmG4G 参考官网地 ...
- H5外包团队 MUI文档技术资料大全
HTML5+ API缓存:http://www.dcloud.io/docs/api/zh_cn/cache.html h.js:http://www.hcoder.net/h vue.js:http ...
- Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded
asp.net 更新数据时报错:Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data ...
- ArcGIS Pro开发Web3D应用(1)——环境搭建与初始实例
1.搭建环境 1.1 ArcGIS Web3D软件环境 ArcGIS Pro 2.0(必须) ArcGIS for Enterprise 10.5.1 (从10.5开始称呼为Enterprise)包括 ...
- 学习笔记78—三大统计相关系数:Pearson、Spearman秩相关系数、kendall等级相关系数
****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...