之前说到过Quartz的基本使用(猛戳这里看文章)。在实际使用中,我们一般会将定时任务交由spring容器来管理。所以今天我们来说说Quartz与spring的整合。

咱们还是依照Quartz的三大元素的顺序来聊聊整合使用。

作业任务

在spring中对于Quartz的作业任务管理主要提供了两种方式,JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean,它们都在org.springframework.scheduling.quartz这个包下。以下我们来看看它们的使用。

  • JobDetailFactoryBean

spring对这个类的解释为:A Spring FactoryBean for creating a Quartz JobDetail instance, supporting bean-style usage for JobDetail configuration.

一个用于创建Quartz JobDetail实例的。支持以bean定义风格来配置JobDetail的工厂bean。

对于在spring中的使用也是非常easy,首先我们须要创建一个详细的作业任务的实现类。使用JobDetailFactoryBean来管理作业任务时,我们的作业任务实现类须要继承QuartzJobBean类,并覆盖其executeInternal方法。就像以下这样。

public class SimpleJob extends QuartzJobBean {

    @Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("如今时间为:"+new Date());
//能够通过上下文获取到JobDataMap,这里面能够存放一些參数类型的数据
JobDataMap dataMap=arg0.getMergedJobDataMap();
String wish=(String) dataMap.get("wish");
System.out.println(wish);
}
}

然后就在spring容器中例如以下配置:

<bean id="jobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!--
參考源代码。我们能够看到属性jobClass为Class类型。所以不能使用ref来引用一个bean。否则就会由于不能将bean转换为Class类型而出现异常。
<property name="jobClass" ref="simpleJob"/>
必须使用value对jobClass赋值。
<property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob"/>
-->
<property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob"/>
<!-- 这里设置的jobDataAsMap能够传递一些參数给作业任务 -->
<property name="jobDataAsMap">
<map>
<entry key="wish" value="hello"/>
</map>
</property>
</bean>
  • MethodInvokingJobDetailFactoryBean

spring对这个类的解释:FactoryBean that exposes a JobDetail object which delegates job execution to a specified (static or non-static) method.

这个FactoryBean提供JobDetail对象,这个对象能够指定作业任务的运行方法。

由于能够指定作业调度时运行的内容,所以使用起来就比JobDetailFactoryBean更加的灵活方便。首先我们还是创建一个作业任务的详细实现类,这个实现类就不须要继承或实现其它的父类,仅仅须要将我们想要运行的作业任务声明在详细的方法中就可以。例如以下:

public class ExampleJob{

    public void execute(){
System.out.println("如今是"+new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date()));
} }

然后在spring容器中例如以下配置就可以:

<!--
假设两个触发器触发同一个作业,那么第二个作业可能在第一个作业完毕之前被触发。
将作业类实现StatefulJob接口就能够避免这样的情况。
将concurrent设置为false能够避免并发的发生。 -->
<!-- 使用MethodInvokingJobDetailFactoryBean来创建作业对象 -->
<bean id="exampleJob" class="com.earl.quartz.spring.job.ExampleJob"/>
<bean id="methodInvokingJobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 目标对象,指的是作业任务的实现类 -->
<property name="targetObject" ref="exampleJob"/>
<!-- 目标方法,指的是指定实现类中的哪个方法作为调度时的运行方法 -->
<property name="targetMethod" value="execute"/>
<!-- 是否并发 -->
<property name="concurrent" value="false"/>
</bean>

以上就是作业任务的相关内容,以下我们来看看触发器这个可爱的小东东。

触发器

在spring中,触发器也分为simpleTrigger和cronTrigger。并且它们的使用也是非常easy,仅仅须要配置一个bean元素就可以。以下我们分别看看它们两者的配置:

  • simpleTrigger
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- 这里的JobDetail指的就是我们配置的作业任务的bean -->
<property name="jobDetail" ref="methodInvokingJobDetailFactoryBeanExample" />
<!-- 延迟5秒開始 -->
<property name="startDelay" value="5000"></property>
<!-- 每3秒反复一次 -->
<property name="repeatInterval" value="3000"></property>
</bean>
  • cronTrigger
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 这里的JobDetail指的就是我们配置的作业任务的bean -->
<property name="jobDetail" ref="jobDetailFactoryBeanExample"/>
<!--cronExpression,cron表达式-->
<property name="cronExpression" value="40 52 17 * * ?"/>
</bean>

以上就是触发器的基本配置。上述两个触发器的工厂bean另一些其它的属性,比如jobDataMap,priority等等。假设有须要,您能够參考相关的文档。

调度程序

最后,最简单的莫过于作业调度程序了,在spring中仅仅须要这样配置就可以:

<bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<!--指定使用哪些触发器。spring会去调度触发对应的触发器。进而对作业任务进行调度处理-->
<property name="triggers">
<list>
<!-- <ref bean="simpleTrigger"/> -->
<ref bean="cronTrigger"/>
</list>
</property>
</bean>

总结

以上就是对Quartz与Spring的整合使用的基本介绍了。

整体来说,Quartz的定时任务功能已经非常强大了,而spring对其的整合更是让程序猿在使用定时任务是如虎添翼。对于Quartz来说还有非常多其它的功能,比如定时文件扫描。定时发送邮件等等,之后在另外一篇文章中再进行详细介绍。

猛戳这里下载源代码

说明:本文介绍的是Quartz与Spring的整合使用,所以请參考源代码时关注com.earl.quartz.spring包下内容就可以,其它可自行忽略。

Quartz与Spring的整合使用的更多相关文章

  1. Quartz与Spring整合进行热部署的实现(一)

    先来几张实现图 任务管理页 新建任务管理.目前实现叫简单的需求...若各位同学要实现复杂的设计...quartz都有提供强大的支持.小弟目前的需求做到这已经够用了. 接下来.我们如何实现quartz的 ...

  2. spring boot 整合quartz ,job不能注入的问题

    在使用spring boot 整合quartz的时候,新建定时任务类,实现job接口,在使用@AutoWire或者@Resource时,运行时出现nullpointException的问题.显然是相关 ...

  3. spring boot整合quartz实现多个定时任务

        版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/78543574 最近收到了很多封邮件, ...

  4. spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

    最近做了一个spring boot 整合 quartz  实现 动态定时任务配置,在集群环境下运行的 任务.能够对定时任务,动态的进行增删改查,界面效果图如下: 1. 在项目中引入jar 2. 将需要 ...

  5. Quartz 在 Spring 中如何动态配置时间--转

    原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...

  6. 定时任务quartz与spring的集成

    我想要在spring的集成框架中使用spring , 暂时采用quartz 根据下面的几篇博客实现了(懒得说了,直接丢链接): Quartz实现动态定时任务 Spring 3整合Quartz 2实现定 ...

  7. 实际工程Quartz与Spring设计与实现一体化的热部署

    1.需求说明 主要负责项目任务调度.使用Quartz.以Spring为辅助. 如今有这样一个需求:我们不知道管理员想设定过多厂时间运行主任务,须要在配置文件定义.在配置好后须要马上运行.实现热部署. ...

  8. 【Spring Boot学习之六】Spring Boot整合定时任务&异步调用

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2一.定时任务1.启动类添加注解@EnableScheduling 用于开启定时任务 package com.wjy; i ...

  9. struts2 spring mybatis 整合(test)

    这几天搭了个spring+struts2+mybatis的架子,练练手,顺便熟悉熟悉struts2. 环境:myEclipse10+tomcat7+jdk1.6(1.8的jre报错,所以换成了1.6) ...

随机推荐

  1. P2654 原核生物培养

    P2654 原核生物培养 题目描述 W教授最近正在研究一种原核生物,这种生物的生长方式很奇特,只能通过吃掉同类而生长.两个该种生物相遇,较大质量的会把较小的吃掉(相同的话就看RP了),吃掉后较大的生物 ...

  2. Selenium2+python自动化32- 测试报告的易读性【转载】

    前言 前一篇已经介绍了报告的生成方法,本篇小编优化一下测试报告,使测试报告便于大多数阅读.虽然在我们在测试用例开发时为每个用例添加了注释,但测试报告一般是给非测试人员阅读的,如果能在报告中为每一个测试 ...

  3. k8s的故障切换(failover)

    当前3个节点的状态都为ready 当前node1有两个pod  node2有1个pod 现在将node1关机会有怎样的现象 ping 分布在node1节点的pod地址已经ping不通. 在node1节 ...

  4. basic paxos解析

    basic paxos是我见过最难懂的算法,我最近一个月都在研究这个东西,自认有一些粗浅的心得,在这里写一下我对它的理解 为了降低理解难度,本文使用了大量的比喻,可能词不达意,见谅 basic pax ...

  5. 实现用http上传文件,用ftp下载文件

    1.ftp配置 1.检查安装vsftpd软件 使用如下命令#rpm -qa |grep vsftpd可以检测出是否安装了vsftpd软件, 如果没有安装,使用YUM命令进行安装. 2.启动服务 使用v ...

  6. rsync用于同步目录

    rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输.rsync中一项与其他大部分类似程序或协定中所未见的重要特性是 ...

  7. 20、Flask实战第20天:Flask上下文

    Local线程隔离对象 我们知道通过request可以获取表单中的数据.如果是多个用户同时在用网站,而全局request就只有一个,那么Flask是如何分辨哪用户对应哪个请求呢? 这种情况下,就会用到 ...

  8. Python __call__内置函数的作用和用法

    开学了进入了实验室,需要协助大师兄做事,主要是OpenStack中的代码解析,但是涉及很多python高级用法,一时间有点麻烦,在做项目的同时慢慢更新博客.这次先写一下__call__的用法,因为经常 ...

  9. 【spfa】bzoj3921 Mimori与树海

    考虑“删除后图仍连通”,即其不是无向图的桥(bridge),可以用Tarjan算法预处理,这里不赘述. [算法一] 枚举删除的是哪条边,然后枚举起点,暴搜,统计答案. 可以通过0.1号测试点. 预计得 ...

  10. [JOISC2017]細長い屋敷

    题目大意: $n(n\le5\times10^5)$个房间排成一排,相邻两个房间之间有一扇门,第$i$个房间和第$i+1$个房间之间的门可以用第$c_i$种钥匙打开(可能有多个门可以用同一种钥匙打开) ...