概述

Spring为创建Quartzde Scheduler、Trigger和JobDetail提供了方便的FactoryBean类,以便能够在Spring容器中享受注入的好处。

此外,Spring还通了一些便利的工具类,用于直接将Spring中的Bean包装成合法的任务。

Spring进一步降低了使用Quartz的难度,能够以更加Spring风格的方式使用Quartz,主要体现在如下两点

  • 为Quartz的重要组件提供更具Bean风格的扩展类

  • 提供创建Scheduler的BeanFactory类,方便在Spring环境下创建对应的组件对象,并结合Spring容器生命周期执行启动和停止的动作


Maven依赖

主要的两个依赖如下:

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context-support</artifactId>
  4. <version>${spring.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.quartz-scheduler</groupId>
  8. <artifactId>quartz</artifactId>
  9. <version>2.2.3</version>
  10. </dependency>

spring-context-support包主要是Spring集成了很多有用的第三方库,我们在使用第三方的东西的时候一般都需要引入该依赖。


步骤

Spring通过xml的方式集成Quartz,主要有两种方式

  1. JobDteail通过JobDetailBean实现

  2. JobDteail通过MethodInvokeJobDetailFactoryBean实现(推荐)


1 创建JobDteail

Spring通过扩展JobDetail提供了一个更具Bean风格的JobDetailFactoryBean,此外Spring还提供了了一个 MethodInvokingJobDetailFactoryBean,通过这个FactoryBean可以将Spring容器中的Bean的方法包装成Quartz任务,这样我们就不必为Job创建对应的类。

案例中会分别讲述两种实现方式的区别


2 创建Trigger

Quartz中另外一个重要的组件就是Trigger,Spring按照相似的思路分别为SimpleTrigger和CronTrigger提供了更具Bean风格的CronTriggerFactoryBean和SimpleTriggerFactoryBean扩展类。


3 创建Scheduler

Quartz的SchedulerFactory是标准的工厂类,不太适合在Spring中使用。 此外为了保证Scheduler能够感知Spring容器的生命周期,在Spring容器启动后,Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。为此Spring提供了SchedulerFactoryBean.


示例-MethodInvokingJobDetailFactoryBean

因为下面的案例中我们使用MethodInvokingJobDetailFactoryBean,所以下面的这个Job无需继承任何类或者实现任何接口

模拟业务类

配置成一个普通的java类即可

  1. package com.xgj.quartz.quartzWithSpring.xml;
  2. /**
  3. *
  4. *
  5. * @ClassName: MyJob
  6. *
  7. * @Description: 不用继承Quartz的Job接口
  8. *
  9. * @author: Mr.Yang
  10. *
  11. * @date: 2017年11月10日 下午10:17:26
  12. */
  13. public class MyJob {
  14. public void execute() {
  15. System.out.println("Quartz Spring XML 配置 - MyJob");
  16. }
  17. }

Spring集成Quartz的配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- 配置Job类 -->
  7. <bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean>
  8. <!-- 配置JobDetail -->
  9. <bean id="springQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  10. <!-- 执行目标job -->
  11. <property name="targetObject" ref="myJob"></property>
  12. <!-- 要执行的方法 -->
  13. <property name="targetMethod" value="execute"></property>
  14. </bean>
  15. <!-- 配置tirgger触发器 -->
  16. <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  17. <!-- jobDetail -->
  18. <property name="jobDetail" ref="springQtzJobMethod"></property>
  19. <!-- cron表达式,执行时间 每5秒执行一次 -->
  20. <property name="cronExpression" value="0/5 * * * * ?"></property>
  21. </bean>
  22. <!-- 配置调度工厂 -->
  23. <bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  24. <property name="triggers">
  25. <list>
  26. <ref bean="cronTriggerFactoryBean"></ref>
  27. </list>
  28. </property>
  29. </bean>
  30. </beans>

除了使用CronTrigger也可以使用SimpleTrigger配置,示例代码如下

  1. <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
  2. <!--配置具体要执行的jobDetail-->
  3. <property name="jobDetail" ref="simpleJobDetail" />
  4. <!--初始延迟时间 1s-->
  5. <property name="startDelay" value="1000" />
  6. <!--间隔执行时间每2s执行一次-->
  7. <property name="repeatInterval" value="2000" />
  8. </bean>

测试类

  1. package com.xgj.quartz.quartzWithSpring.xml;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. public class SpringQuartzXmlTest {
  4. public static void main(String[] args) {
  5. // 启动Spring 容器
  6. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
  7. "classpath:com/xgj/quartz/quartzWithSpring/xml/application.xml");
  8. System.out.println("initContext successfully");
  9. }
  10. }

在调度器中,有一个lazy-init参数,如果lazy-init=’false’,则容器启动时就会执行调度程序;如果lazy-init=’true’,则需要实例化该bean才能执行调度程序;

  1. <bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="true">

运行结果

  1. 2017-11-11 02:03:41,399 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@174580e6: startup date [Sat Nov 11 02:03:41 BOT 2017]; root of context hierarchy
  2. 2017-11-11 02:03:41,481 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/quartz/quartzWithSpring/xml/application.xml]
  3. INFO StdSchedulerFactory - Using default implementation for ThreadExecutor
  4. INFO SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
  5. INFO QuartzScheduler - Quartz Scheduler v.2.2.3 created.
  6. INFO RAMJobStore - RAMJobStore initialized.
  7. INFO QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'
  8. Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  9. NOT STARTED.
  10. Currently in standby mode.
  11. Number of jobs executed: 0
  12. Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  13. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
  14. INFO StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance.
  15. INFO StdSchedulerFactory - Quartz scheduler version: 2.2.3
  16. INFO QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@7fe0dbb6
  17. 2017-11-11 02:03:42,862 INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647
  18. 2017-11-11 02:03:42,862 INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now
  19. INFO QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started.
  20. initContext successfully
  21. Quartz Spring XML 配置 - MyJob
  22. Quartz Spring XML 配置 - MyJob
  23. Quartz Spring XML 配置 - MyJob
  24. Quartz Spring XML 配置 - MyJob
  25. Quartz Spring XML 配置 - MyJob
  26. .......
  27. .......
  28. .......
  29. .......

示例-JobDetailFactoryBean

业务Job模拟类

  1. package com.xgj.quartz.quartzWithSpring.xml2;
  2. import org.quartz.JobExecutionContext;
  3. import org.quartz.JobExecutionException;
  4. import org.springframework.scheduling.quartz.QuartzJobBean;
  5. /**
  6. *
  7. *
  8. * @ClassName: MyJob2
  9. *
  10. * @Description: 配置文件中使用JobDetailBean,这是业务Job需要继承QuartzJobBean
  11. *
  12. * @author: Mr.Yang
  13. *
  14. * @date: 2017年11月12日 上午7:54:28
  15. */
  16. public class MyJob2 extends QuartzJobBean {
  17. @Override
  18. protected void executeInternal(JobExecutionContext ctx)
  19. throws JobExecutionException {
  20. System.out.println("Spring 集成 Quartz 的第二种方式");
  21. }
  22. }

Spring集成Quartz的配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- 配置Job类 -->
  7. <bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean>
  8. <!-- 配置JobDetail -->
  9. <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
  10. <property name="jobClass" value="com.xgj.quartz.quartzWithSpring.xml2.MyJob2"></property>
  11. <property name="durability" value="true"></property>
  12. </bean>
  13. <!-- 配置tirgger触发器 -->
  14. <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  15. <!-- jobDetail -->
  16. <property name="jobDetail" ref="jobDetail"></property>
  17. <!-- cron表达式,执行时间 每5秒执行一次 -->
  18. <property name="cronExpression" value="0/5 * * * * ?"></property>
  19. </bean>
  20. <!-- 配置调度工厂 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
  21. <bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  22. <property name="triggers">
  23. <list>
  24. <ref bean="cronTriggerFactoryBean"></ref>
  25. </list>
  26. </property>
  27. </bean>
  28. </beans>

测试类

  1. package com.xgj.quartz.quartzWithSpring.xml2;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. public class SpringQuartzXmlTest {
  4. public static void main(String[] args) {
  5. // 启动Spring 容器
  6. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
  7. "classpath:com/xgj/quartz/quartzWithSpring/xml2/spring-quartz.xml");
  8. System.out.println("initContext successfully");
  9. }
  10. }

运行结果

  1. 2017-11-12 08:14:27,934 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4af6178d: startup date [Sun Nov 12 08:14:27 BOT 2017]; root of context hierarchy
  2. 2017-11-12 08:14:28,014 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/quartz/quartzWithSpring/xml2/spring-quartz.xml]
  3. INFO StdSchedulerFactory - Using default implementation for ThreadExecutor
  4. INFO SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
  5. INFO QuartzScheduler - Quartz Scheduler v.2.2.3 created.
  6. INFO RAMJobStore - RAMJobStore initialized.
  7. INFO QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'
  8. Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  9. NOT STARTED.
  10. Currently in standby mode.
  11. Number of jobs executed: 0
  12. Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  13. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
  14. INFO StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance.
  15. INFO StdSchedulerFactory - Quartz scheduler version: 2.2.3
  16. INFO QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@404f4560
  17. 2017-11-12 08:14:28,800 INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647
  18. 2017-11-12 08:14:28,801 INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now
  19. INFO QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started.
  20. initContext successfully
  21. Spring 集成 Quartz 的第二种方式
  22. Spring 集成 Quartz 的第二种方式
  23. Spring 集成 Quartz 的第二种方式
  24. Spring 集成 Quartz 的第二种方式
  25. Spring 集成 Quartz 的第二种方式
  26. .......
  27. .......
  28. .......

示例源码

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

本文转自:https://blog.csdn.net/yangshangwei/article/details/78505730?locationNum=6&fps=1

spring通过配置xml文件集成quartz定时器的更多相关文章

  1. 菜鸟学习Spring——60s配置XML方法实现简单AOP

    一.概述. 上一篇博客讲述了用注解的形式实现AOP现在讲述另外一种AOP实现的方式利用XML来实现AOP. 二.代码演示. 准备工作参照上一篇博客<菜鸟学习Spring--60s使用annota ...

  2. spring security 配置xml 参考

    https://blog.csdn.net/zsq520520/article/details/77880491

  3. spring c3p0 配置

      spring c3p0 配置   <?xml version="1.0" encoding="UTF-8"?> <beansxmlns=& ...

  4. 【spring配置】——spring整合Quartz定时器

    第一种:为普通java类中的某个方法配置跑批任务 MethodInvokingJobDetailFactoryBean CronTriggerBean SchedulerFactoryBean 1.定 ...

  5. Spring的quartz定时器同一时刻重复执行二次的问题解决

    最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...

  6. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群

    Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...

  7. Spring的quartz定时器重复执行二次的问题解决

    Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的ha ...

  8. spring启动quartz定时器

    在很多中经常要用到定时任务,quartz是定时器中比较好用的,在Spring中使用quartz是很容易的事情,首先在spring的applicationContext.xml文件中增加如下配置: &l ...

  9. java定时器,Spring定时器和Quartz定时器

    一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...

随机推荐

  1. 判断URL是否支持断点续传?

    #python #xiaodeng #判断URL是否支持断点续传? import urllib2 req = urllib2.Request('http://ftp.ubuntu.com/') req ...

  2. CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

  3. PHP:微信小程序调用【统一下单】【微信支付】【支付回调】API;XML转Array,Array转XML方法(通用)

    1.微信公众号.微信小程序开发过程中,第三方服务器与微信服务器数据交互,需要进行数据转换,必须用到这两个函数: 分别是xml_to_array.array_to_xml ; /** * 输出xml字符 ...

  4. 列表生成式&生成器表达式

    一.列表生成式 def func(): return [lambda x:i*x for i in range(4)] print([j(2) for j in func()]) 结果:[6,6,6, ...

  5. java多线程(五)之总结(转)

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  6. 【LeetCode】48. Rotate Image (2 solutions)

    Rotate Image You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees ...

  7. iOS拦截导航栏返回按钮事件的正确方式

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  8. 【Linux】文件种类与扩展名

    任何装置在Linux底下都是文件.不仅如此,连数据沟通的接口也有专属的文件在负责-所以,你会了解到,Linux的文件种类真的很多- Linux文件种类 我们在刚刚提到使用『ls -l』观察到第一栏那十 ...

  9. 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

    [ASP.NET Core]EF Core - “影子属性”   有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...

  10. python学习笔记012——locals与globals

    1 定义 globals() 功能:收集全局变量参数:无返回值:得到一个收集全局变量的字典(会包含系统的内置变量) locals() 功能:收集局部变量参数:无返回值:得到一个收集局部变量的字典 a ...