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实例传入参数的情况,可以通过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 执行 !!!

原文地址:https://www.cnblogs.com/crazysquirrel/p/8889448.html

时间: 2024-08-28 08:25:12

quartz任务调度框架与spring整合的相关文章

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

8.7.2 MVC 框架与Spring整合的思考 对于一个基于B/S架构的JAVA EE 应用而言,用户请求总是向MVC框架的控制器请求,而当控制器拦截到用户请求后,必须调用业务逻辑组件来处理用户请求.此时有一个问题:控制器应该如何获得业务逻辑组件? 最容易想到的策略是,直接通过new 关键字创建业务逻辑组件,然后调用业务逻辑组件的方法,根据业务逻辑方法的返回值确定结果. 在实际的应用中,很少见到采用上面的访问策略,因为这是一种非常差的策略.不这样做至少有如下三个原因: ⊙ 控制器直接创建业务逻

Mina框架与Spring整合配置文件

Mina框架与Spring的整合其实很简单,主要是要弄清楚要注入的属性的名称,进而选择合适的注入方法. 关于Spring的四种注入方法请另一篇文章:spring依赖注入的四种方式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w

配置quartz任务调度框架

<properties> <quartz.version>2.2.2</quartz.version> </properties> <dependencyManagement> <dependencies> <!-- quartz任务调度框架 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&g

Quartz 任务调度框架整合Spring使用

简介 Quartz是一个完全由java编写的开源作业调度框架,其实是启动定时任务的框架.使用时只需创建一个org.quartz.Job接口的实现类,实现唯一的方法:public void execute(JobExecutionContext context) throws JobExecutionException,将你的逻辑任务添加到execute()方法即可. 一.基本概念 (一).执行对象 Job :工作任务 ,你要做什么 Trigger:执行工作任务 触发条件 , 什么时间执行, 多久

Quartz任务调度框架使用

一.什么是Quartz Quartz是一个完全由java编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了! 下载官网:http://www.quartz-scheduler.org/ 可以在maven项目中导入对应的坐标 二.Quartz快速入门 建立一个maven项目 导入Quartz的maven坐标 其中官网中提供了一下案例可以参考一下 网站:http://www.quartz-scheduler

SpringBoot 1.5.x 集成 Quartz 任务调度框架

Quartz 有分 内存方式 和 数据库方式 内存方式任务信息保存在内存中, 停机会丢失, 需手动重新执行, 数据库方式: 任务信息保存在数据库中, 重点是支持集群. 内存方式 RAMJobStore 和 数据库方式 JobStoreTX, RAMJobStore 适合单机, 不支持集群,  JobStoreTX 支持集群. 下面介绍的就是 JobStoreTX 数据库方式. 1. 添加主要的相关依赖, 其他依赖这里就不说了 <dependency> <groupId>org.qu

jbpm工作流框架与Spring整合的步骤

1. 在jbpm.cfg.xml文件中注销掉自己的,导入需要的配置文件 <!-- 注销掉这个 <import resource="jbpm.tx.hibernate.cfg.xml" /> --> <!-- 添加这个配置文件 --> <import resource="jbpm.tx.spring.cfg.xml" /> 2.在hibernate.cfg.xml文件中导入配置文件 <!-- 这是jbmp的配置文件

ssh框架中spring整合hibernate的配置文件模板(带详细注释)

applicationContext.xml的配置文件模板 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:aop=&quo

Quartz任务调度框架

Quartz使用总结 教程