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实例传入参数的情况,可以通过JobDetailFactoryBeanjobDataAsMap属性传入,然后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. 1、Shiro 安全框架与Spring 整合详解

    Apache Shiro 是一个安全认证框架,和 Spring Security 相比,在于他使用了比较简洁易懂的认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存在 ...

  2. 8 -- 深入使用Spring -- 7...2 MVC框架与Spring整合的思考

    8.7.2 MVC 框架与Spring整合的思考 对于一个基于B/S架构的JAVA EE 应用而言,用户请求总是向MVC框架的控制器请求,而当控制器拦截到用户请求后,必须调用业务逻辑组件来处理用户请求 ...

  3. Maven环境下搭建SSH框架之Spring整合Hibernate

    © 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...

  4. Mina框架与Spring整合配置文件

    Mina框架与Spring的整合事实上非常easy,主要是要弄清楚要注入的属性的名称,进而选择合适的注入方法. 关于Spring的四种注入方法请还有一篇文章:spring依赖注入的四种方式 <? ...

  5. Maven环境下搭建SSH框架之Spring整合Struts2

    © 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Struts2:2.5.10 Spring:4.3.8.RELEASE 注意:其他版本在某些特性的使用上可能稍微存在差别 2.准备工作 ...

  6. 从0开始整合SSM框架--2.spring整合mybatis

    依赖:<properties> <!-- spring版本号 --> <spring.version>4.1.3.RELEASE</spring.versio ...

  7. SpringBoot之整合Quartz调度框架-基于Spring Boot2.0.2版本

    1.项目基础 项目是基于Spring Boot2.x版本的 2.添加依赖 <!-- quartz依赖 --> <dependency> <groupId>org.s ...

  8. Quartz —— 任务调度框架

    一.Quartz Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 年被 Terracotta 收购,目前是 Terrac ...

  9. Quartz 任务调度框架之Hello World

    0x01 什么是Quartz? Quartz是一个完全由java编写的开源作业调度框架. 0x02 实战Quartz Hello World 创建Maven项目,POM 文件配置如下: <pro ...

随机推荐

  1. Latex 经常见到的问题和解决方法

    Latex 经常见到的问题和解决方法 2017-04-10  22:05:48 [资源下载]Texlive 2018 下载地址:http://mirror.lzu.edu.cn/CTAN/system ...

  2. thinkphp 操作xml格式

    前言:虽然xml的格式看起来跟html差不多,但是最近做项目由于用的是thinkphp5.0的版本,做的过程中还是遇到了一些问题.在这里做一下记录. 首先我们需要定义一个dom对象,我们都知道 php ...

  3. c++ std::advance

    // advance example #include <iostream> // std::cout #include <iterator> // std::advance ...

  4. Oracle 创建,查询,删除 job

    一 . 创建job 1. 通过创建存储过程的方式创建job 调用该存储过程使其开始执行  call PRO_DSJ_XJTJ_JOB(); create or replace procedure PR ...

  5. haproxy keepalived和nodejsv9的容器镜像所需文件

    配合hub.docker.com 的dablyo/haproxy-keepalived-nodejsv9:190407 使用的 [root@haproxy ~]# cat haproxy.cfgglo ...

  6. D - Mayor's posters(线段树+离散化)

    题目: The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campai ...

  7. 上海高校程序设计联赛 D-CSL的字符串 栈模拟

    题目链接:https://ac.nowcoder.com/acm/contest/551/D ASCII码表示的字符转换成整数实测不超过200(具体多少懒得查了) 分析:要求总的字典序最小,那就让最小 ...

  8. Codeforces Round #422 (Div. 2)E. Liar sa+st表+dp

    题意:给你两个串s,p,问你把s分开顺序不变,能不能用最多k段合成p. 题解:dp[i][j]表示s到了前i项,用了j段的最多能合成p的前缀是哪里,那么转移就是两种,\(dp[i+1][j]=dp[i ...

  9. js如何实现类的继承

    方法一:借助构造函数实现继承 这种方法的缺点:原型链上的东西并没有被继承. 方法二:借助原型链实现继承 这种方法的缺点:改变了一个实例对象,另一个实例对象也跟着改变,因为s1.__proto__ == ...

  10. IDEA常用操作

    ctrl+tab:切换不同的tab Ctrl+D:比较两个目录或文件(先选中) Alt+斜杠 :智能感知提示单词 Ctrl+K :版本修改记录 Alt+Enter:正则检查 Ctrl+Alt+B:查找 ...