文章目录

  • 概述
  • Maven依赖
  • 步骤
    • 1 创建JobDteail
    • 2 创建Trigger
    • 3 创建Scheduler
  • 示例-MethodInvokingJobDetailFactoryBean
  • 示例-JobDetailFactoryBean
  • 示例源码

概述

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

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

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

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

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


Maven依赖

主要的两个依赖如下:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version>
</dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version>
</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类即可

package com.xgj.quartz.quartzWithSpring.xml;/*** * * @ClassName: MyJob* * @Description: 不用继承Quartz的Job接口* * @author: Mr.Yang* * @date: 2017年11月10日 下午10:17:26*/
public class MyJob {public void execute() {System.out.println("Quartz Spring XML 配置 - MyJob");}}

Spring集成Quartz的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置Job类 --><bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean><!-- 配置JobDetail --><bean id="springQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 执行目标job --><property name="targetObject" ref="myJob"></property><!-- 要执行的方法 --><property name="targetMethod" value="execute"></property></bean><!-- 配置tirgger触发器 --><bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- jobDetail --><property name="jobDetail" ref="springQtzJobMethod"></property><!-- cron表达式,执行时间  每5秒执行一次 --><property name="cronExpression" value="0/5 * * * * ?"></property></bean><!-- 配置调度工厂 --><bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTriggerFactoryBean"></ref></list></property></bean>
</beans>

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

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

测试类

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

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

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

运行结果

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
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]
INFO  StdSchedulerFactory - Using default implementation for ThreadExecutor
INFO  SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO  QuartzScheduler - Quartz Scheduler v.2.2.3 created.
INFO  RAMJobStore - RAMJobStore initialized.
INFO  QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO  StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance.
INFO  StdSchedulerFactory - Quartz scheduler version: 2.2.3
INFO  QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@7fe0dbb6
2017-11-11 02:03:42,862  INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647
2017-11-11 02:03:42,862  INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now
INFO  QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started.
initContext successfully
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
.......
.......
.......
.......

示例-JobDetailFactoryBean

业务Job模拟类

package com.xgj.quartz.quartzWithSpring.xml2;import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;/*** * * @ClassName: MyJob2* * @Description: 配置文件中使用JobDetailBean,这是业务Job需要继承QuartzJobBean* * @author: Mr.Yang* * @date: 2017年11月12日 上午7:54:28*/
public class MyJob2 extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext ctx)throws JobExecutionException {System.out.println("Spring 集成 Quartz 的第二种方式");}}

Spring集成Quartz的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置Job类 --><bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean><!-- 配置JobDetail --><bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="com.xgj.quartz.quartzWithSpring.xml2.MyJob2"></property><property name="durability" value="true"></property></bean><!-- 配置tirgger触发器 --><bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- jobDetail --><property name="jobDetail" ref="jobDetail"></property><!-- cron表达式,执行时间  每5秒执行一次 --><property name="cronExpression" value="0/5 * * * * ?"></property></bean><!-- 配置调度工厂 如果将lazy-init='false'那么容器启动就会执行调度程序 --><bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTriggerFactoryBean"></ref></list></property></bean>
</beans>

测试类

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

运行结果

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
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]
INFO  StdSchedulerFactory - Using default implementation for ThreadExecutor
INFO  SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO  QuartzScheduler - Quartz Scheduler v.2.2.3 created.
INFO  RAMJobStore - RAMJobStore initialized.
INFO  QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO  StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance.
INFO  StdSchedulerFactory - Quartz scheduler version: 2.2.3
INFO  QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@404f4560
2017-11-12 08:14:28,800  INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647
2017-11-12 08:14:28,801  INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now
INFO  QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started.
initContext successfully
Spring 集成 Quartz 的第二种方式
Spring 集成 Quartz 的第二种方式
Spring 集成 Quartz 的第二种方式
Spring 集成 Quartz 的第二种方式
Spring 集成 Quartz 的第二种方式
.......
.......
.......

示例源码

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

Quartz-Spring集成Quartz通过XML配置的方式相关推荐

  1. spring集成quartz报org.springframework.scheduling.quartz.CronTriggerBean异常

    spring集成quartz项目做定时任务,但是启动tomcat报错: ClassNotFoundException: org.springframework.scheduling.quartz.Cr ...

  2. Spring装配Bean---使用xml配置

    声明Bean Spring配置文件的根元素是<beans>. 在<beans>元素内,你可以放所有的Spring配置信息,包括<bean>元素的声明. 除了Bean ...

  3. 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP

    上节我们提到了使用基于注解实现的AOP,这节我们将用基于xml配置的方式来实现的AOP. 1.首先建立一个类,作为切面类,这个类主要用来实现注解中各种通知要实现的方法. 1 package com.y ...

  4. 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法

    转载自  在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法 我们在配Spring 或者Hibernate 配置文件的时候,发觉在配置类路径的时候,在双引号下 ...

  5. 【Spring学习05】四种xml配置注入方式

    本文博客地址:http://blog.csdn.net/soonfly/article/details/68507615 (转载请注明出处) 平常应用Spring开发中,用得最多的是容器.spring ...

  6. Quartz学习总结(1)——Spring集成Quartz框架

    一.Quartz简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简 ...

  7. 主题:spring集成quartz,出现2次重复调用的问题

    在项目中使用了quartz的任务调度,在本地测试的时候没有问题,只会调用1次部署到服务器上后,发现同一个任务,在相同的时间被调用了2次.本地环境 windowsXP ,spring2.5.1, sun ...

  8. spring集成quartz框架

    2019独角兽企业重金招聘Python工程师标准>>> 1.Spring对quartz支持 2.实例(按红色部分配置) 1)引入quartz包 <dependency>& ...

  9. Spring Aop实例之xml配置

    上篇博文<3幅图让你了解Spring AOP>中介绍了aop通知类型,AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代 ...

最新文章

  1. c# unchecked关键字。byte 合并short
  2. js验证手机号码是否符合标准
  3. 受 SQLite 多年青睐,C 语言到底好在哪儿?
  4. 如何对聚类结果进行分析_如何更合理地给聚类结果贴标签——由一个挖掘学生用户的项目说开去...
  5. 互联网+大赛作品_【快讯】智物联获第二届中国工业互联网大赛优秀作品奖
  6. VS2005+SQL2005 Reporting Service动态绑定报表(Web)
  7. android apk 反编译,android编译错误解决方法
  8. vue项目中打包的相关配置问题
  9. 相机成像原理详解(透视成像)
  10. JS常见网页特效案例
  11. C# 使用SHFileOperation 复制文件 注意引用方式
  12. 不同公式等号对齐_魔方的公式(第二版)
  13. SMAA算法详解 - SMAAEdgeDetectionVS
  14. msp430g2553流水灯
  15. 第十四届蓝桥杯C++B组题解(不完全对)
  16. 使用beautifulSoup
  17. mes系统的主要功能是什么?看完这篇你就懂了
  18. android中contains的用法
  19. manjaro 显卡驱动
  20. 李昌镐:苍老的青春(转载)

热门文章

  1. mysq改变字段类型
  2. Python量化(八)下影线选股法
  3. 强化学习笔记:Policy-based Approach
  4. Tableau系列之构建和浏览数据视图
  5. Python中时间戳与时间字符串相互转换
  6. Python入门100题 | 第075题
  7. svn错误:Two top-level reports with no target
  8. linux下=号与==号
  9. 百度指数cookie不可用解决方案
  10. 云端大数据实战记录-大数据推荐