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. mac pycharm快捷键

    Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...

  2. (void) (&_min1 == &_min2);【转】

    本文转载自:https://blog.csdn.net/xiaofeng_yan/article/details/5248693 偶然在<./linux/include/linux/kernel ...

  3. Elasticsearch .net client NEST 空字符/null值查询

    null值查询 当某个字段值为null时,其实在es里该条数据是没有这个字段的.查询时检测包含不包含该字段就行. /// <summary> /// null 值查询 /// 当数据为Nu ...

  4. 目标指定法——S.M.A.R.T.

    一个有效的目标一定要是 具体的(Specific), 可测量的(Measureable), 可实现的(Attainable), 有现实意义的(Realistic), 以及有明确期限的(Time-bas ...

  5. mongodb在ubuntu下无法打开的问题

    通过查询大概知道了是非正常关闭,mongod.lock的事,ubuntu的mongod.lock在/var/lib/mongodb中,删除之后即可重新打开.

  6. VBoxManage

    虚拟机名称 centos6.9-1 centos6.9-2 centos6.9-3 使用命令开机 虚拟机 VBoxManage startvm 'centos6.9-1' 正常启动 VBoxManag ...

  7. 稠州银行数字化转型:打造银行数据大脑,建立全新数字化DNA

    数字经济时代,银行如何进行数字化转型?业务模式转型与科技转型如何协同并进? 2019年1月4日,在上海蚂蚁金服ATEC城市峰会上,浙江稠州商业银行(以下简称“稠州银行”)副行长兼首席信息官程杰分享了稠 ...

  8. .Net Core文件上传

    https://www.cnblogs.com/viter/p/10074766.html 1.内置了很多种绑定模型  缺少了一个FromFileAttribute 绑定模型 需要自己实现一个 pub ...

  9. bean 装配

    1.装配方式 (1)在xml进行显式装配 (2)在java中进行显式装配 (3)隐式的bean发现机制和自动装配 2.装配方式(3)实现 (1)创建bean /** * @component告诉spr ...

  10. Flutter采坑之路 用真机跑起来的时候提示 initGradle失败,IO异常,downloading Gradle-4.6-all.zip失败

    这个异常就是Gradle下载异常,进而下面会提示一行IO异常 我这里的原因就是Gradle对应的4.6-all版本下载不下来(一般情况下确实很难下载下来) 所以在正常AS工程呢,我们选择一下Gradl ...