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. easyUI提交不跳转

    $('#loginForm').form('submit');为easyUI封装的异步提交方法,页面不跳转,可得到返回值. $('#loginForm').submit();为js自带原生表单提交方法 ...

  2. oracle 审计功能

    Oracle 11g推出了审计功能,但这个功能会针对很多操作都产生审计文件.aud,日积月累下来这些文件也很多,默认情况下,系统为了节省资源,减少I/0操作,其审计功能是关闭的 一.审计功能关闭 1. ...

  3. call 和 apply方法解析

    ECAMScript 3给Function的原型定义了两个方法,它们是 `Function.prototype.call` 和 `Function. prototype.apply`.在实际开发中,特 ...

  4. Request类源码分析

    通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: 代码 ...

  5. L1范数与L2范数​

    L1范数与L2范数​ ​ L1范数与L2范数在机器学习中,是常用的两个正则项,都可以防止过拟合的现象.L1范数的正则项优化参数具有稀疏特性,可用于特征选择:L2范数正则项优化的参数较小,具有较好的抗干 ...

  6. GIT导出差异版本更新的文件列表

    之前写了一篇SVN导出差异版本更新的文件列表 这次写git如何导出差异化版本文件列表 查找了一番,发现git diff这个命令 $ git diff 2da595c daea1d6 --name-on ...

  7. Python3爬虫相关软件,库的安装

    Anaconda 百度搜Anaconda清华,根据环境选择版本下载 安装时记得勾选添加到环境变量,不要还要手动添加 Anaconda Navigator可视化界面,可以方便地调用Jupyter等工具. ...

  8. 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面

    Ocelot   路由  请求聚合  服务发现 认证  鉴权 限流熔断 内置负载均衡器 Consul   自动服务发现    健康检查 通过Ocelot搭建API网关   服务注册   负载均衡 1. ...

  9. HBase详解

    1.   hbase简介 1.1.  什么是hbase HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. H ...

  10. GT sport真实赛道详解 - Brands Hatch | 伯蘭士赫治GP賽車場

    参考:GT sport所有赛道简介 GT Sport - Tip/Guide For FASTER LAP TIMES (Brands Hatch) 赛道介绍.跑法.赛事网上都有大把的视频. GT s ...