spring通过配置xml文件集成quartz定时器
概述
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,主要有两种方式
JobDteail通过JobDetailBean实现
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/beans
http://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: 0
Using 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 {
@Override
protected 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/beans
http://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: 0
Using 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
本文转自:https://blog.csdn.net/yangshangwei/article/details/78505730?locationNum=6&fps=1
spring通过配置xml文件集成quartz定时器的更多相关文章
- 菜鸟学习Spring——60s配置XML方法实现简单AOP
一.概述. 上一篇博客讲述了用注解的形式实现AOP现在讲述另外一种AOP实现的方式利用XML来实现AOP. 二.代码演示. 准备工作参照上一篇博客<菜鸟学习Spring--60s使用annota ...
- spring security 配置xml 参考
https://blog.csdn.net/zsq520520/article/details/77880491
- spring c3p0 配置
spring c3p0 配置 <?xml version="1.0" encoding="UTF-8"?> <beansxmlns=& ...
- 【spring配置】——spring整合Quartz定时器
第一种:为普通java类中的某个方法配置跑批任务 MethodInvokingJobDetailFactoryBean CronTriggerBean SchedulerFactoryBean 1.定 ...
- Spring的quartz定时器同一时刻重复执行二次的问题解决
最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...
- Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群
Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...
- Spring的quartz定时器重复执行二次的问题解决
Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的ha ...
- spring启动quartz定时器
在很多中经常要用到定时任务,quartz是定时器中比较好用的,在Spring中使用quartz是很容易的事情,首先在spring的applicationContext.xml文件中增加如下配置: &l ...
- java定时器,Spring定时器和Quartz定时器
一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...
随机推荐
- mysql的常用函数、流程控制
case when用法: END END if用法 IF(expr1,expr2,expr3) #表达式expr1为真则返回expr2否则为expr3 , , ) #结果: 1 ifnull用法: I ...
- jQuery ajax - ajax() 方法详解
一些代码通过jQuery来做ajax异步提交. //验证昵称是否存在 function checkNickNameIsExist(){ var nickName = jQuery("#nic ...
- 微信小程序Tab选项卡切换大集合
代码地址如下:http://www.demodashi.com/demo/14028.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- ie上画圆饼图
概述 主要运用到CSS3的transform.js.jq实现饼状图效果 详细 代码下载:http://www.demodashi.com/demo/10579.html 一.准备工作 1.主要运用到C ...
- JavaScript中的数组与伪数组的区别
在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function). 基本数据类型:String,boolean,Number,Undefined, Null 引用数 ...
- 用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
现有一需求去curl 在香港的一个接口, 返回值有时正常有时报错 connection reset by peer . 思路: 若 执行成功 $?返回 0 , 不成功则返回其他数字 #!/bin/b ...
- 使用SplashScreenManager控件定制程序加载页面
需要devexpress版本在12.0及以上才支持 https://www.cnblogs.com/wuhuacong/p/6112461.html 在DevExpress程序中使用SplashScr ...
- Ubuntu下python两个版本的切换
最近在Ubuntu16.04安装了python3.5还有系统自带的python2.7.13,总结一下不同版本的切换问题. alias:别名 bashrc:个人配置文件 一.修改Python版本(针对用 ...
- jdbc连接hive0.14
Jdbc连接hive0.14版本号 眼下官网最新版本号是hive0.13,要想下载最新的hive得去git上去clone一个. Hive0.14最大特点是支持直接插入. 如今做一个jdbc连接hive ...
- [QT] 小知识集锦
qt 中关于 QWidget 的背景颜色和背景图片的设置 首先设置autoFillBackground 属性为真 然后定义一个QPalette 对象 设置QPalette 对象的背景属性(颜色或图片) ...