Spring整合Quartz
目录[-]
- 一、Spring创建JobDetail的两种方式
- 二、整合方式一示例步骤
- 1、将spring核心jar包、quartz.jar和Spring-context-support.jar导入类路径。
- 2、编写Job类PunchJob(该类必须继承QuartzJobBean)
- 3、编写quartz.xml配置文件
- 4、让容器加载quartz.xml
- 5、配置quartz的运行环境:quartz.properties文件(放在类路径下)
- 三、注意事项
一、Spring创建JobDetail的两种方式
定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时任务开发的目的,总体说第二种对开发人员更方便!
配置Spring的任务调度抽象层简化了任务调度,在Quartz的基础上提供了更好的调度对象。Spring使用Quartz框架来完成任务调度,创建Quartz的作业Bean(JobDetail),有一下两种方法:
1:利用JobDetailBean包装QuartzJobBean子类(即Job类)的实例。
2:利用MethodInvokingJobDetailFactoryBean工厂Bean包装普通的Java对象(即Job类)。
说明:
1:采用第一种方法 创建job类,一定要继承QuartzJobBean ,实现 executeInternal(JobExecutionContext
jobexecutioncontext)方法,此方法就是被调度任务的执行体,然后将此Job类的实例直接配置到JobDetailBean中即可。这种方法和在普通的Quartz编程中是一样的。
2:采用第二种方法 创建Job类,无须继承父类,直接配置MethodInvokingJobDetailFactoryBean即可。但需要指定一下两个属性:
targetObject:指定包含任务执行体的Bean实例。
targetMethod:指定将指定Bean实例的该方法包装成任务的执行体。
二、整合方式一示例步骤
1、将spring核心jar包、quartz.jar和Spring-context-support.jar导入类路径。
千万不忘了导入spring-context-support-3.2.0.M2.jar:这是因为这种方式是利用SPring封装的Quartz类进行特定方法的实现。
我们用到的两个JobDetail:org.springframework.scheduling.quartz.JobDetailBean 和org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean ;
触发器:org.springframework.scheduling.quartz.CronTriggerBean ;调度器:org.springframework.scheduling.quartz.SchedulerFactoryBean 都来源于这个jar包。
2、编写Job类PunchJob(该类必须继承QuartzJobBean)
- package org.crazyit.hrsystem.schedule;
- import java.util.Date;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.crazyit.hrsystem.service.EmpManager;
- public class PunchJob
- extends QuartzJobBean
- {
- //判断作业是否执行的旗标
- private boolean isRunning = false;
- //该作业类所依赖的业务逻辑组件
- private EmpManager empMgr;
- public void setEmpMgr(EmpManager empMgr)
- {
- this.empMgr = empMgr;
- }
- //定义任务执行体
- public void executeInternal(JobExecutionContext ctx)
- throws JobExecutionException
- {
- if (!isRunning)
- {
- System.out.println("开始调度自动打卡");
- isRunning = true;
- //调用业务逻辑方法
- empMgr.autoPunch();
- isRunning = false;
- }
- }
- }
3、编写quartz.xml配置文件
- <?xml version="1.0" encoding="GBK"?>
- <!-- 指定Spring配置文件的Schema信息 -->
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
- default-lazy-init="false">
- <!-- 定义<span style="font-family:'courier new','courier';">一</span>个业务逻辑组件,继承业务逻辑组件的模板 -->
- <bean id="empManager"
- class="org.crazyit.hrsystem.service.impl.EmpManagerImpl"
- parent="managerTemplate"/>
- <!-- 定义触发器来管理任务Bean -->
- <bean id="cronTriggerPunch"
- class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail">
- <!-- 使用嵌套Bean的方式来定义任务Bean -->
- <bean
- class="org.springframework.scheduling.quartz.JobDetailBean">
- <!-- 指定任务Bean的实现类 -->
- <property name="jobClass"
- value="org.crazyit.hrsystem.schedule.PunchJob"/>
- <!-- 为任务Bean注入属性 -->
- <property name="jobDataAsMap">
- <map>
- <entry key="empMgr" value-ref="empManager"/>
- </map>
- </property>
- </bean>
- </property>
- <!-- 指定Cron表达式:周一到周五7点、12点执行调度 -->
- <property name="cronExpression"
- value="0 0 7,12 ? * MON-FRI"/>
- </bean>
- <!-- 执行实际的调度器-->
- <bean
- class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref bean="cronTriggerPunch"></ref>
- <!-- <ref local="cronTriggerPunch"/> 两者都可以用 -->
- </list>
- </property>
- </bean>
- </beans>
job data map(jobDataAsMap)可通过JobExecutionContext (执行时传递)获取。JobDetailBean将 job data map的属性映射到job的属性。如例所示,如果job类PunchJob中包含一个empMgr属性,JobDetailBean将自动注入到Job类PunchJob的实例中,可用于传递参数。如果不写明,就会报
java.lang.NullPointerException错误,主要是因为没有注入Bean。
在上面的配置中我们是让触发器和任务嵌套的,其实还可以将他们分离,形如:
<!-- 定义JobDetail的Bean -->
<bean id="saveProjectJob"
class="org.springframework.scheduling.quartz.JobDetailBean">
<!-- 定义Job的Bean -->
<property name="jobClass">
<value>
com.gresoft.fileupload.service.ParseFileQuartz
</value>
</property>
<!-- 定义Job的Bean中引用到的其他Bean -->
<property name="jobDataAsMap">
<map>
<entry key="readXmlService">
<ref bean="readXmlService" />
</entry>
</map>
</property>
</bean>
<!-- ----------------------------------------------------------- -->
<!-- 定义触发器的Bean -->
<bean id="saveCron"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 指定jobDetail -->
<property name="jobDetail">
<!-- <ref bean="saveProjectJob"></ref>两者都可以用 -->
<ref local="saveProjectJob" />
</property>
<!-- 指定任务触发的时间 -->
<property name="cronExpression">
<value>0/30 * * * * ?</value>
</property>
</bean>
4、让容器加载quartz.xml
在web.xml中添加:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,/WEB-INF/quartz.xml</param-value>
</context-param>
###其实quartz.xml文件的内容完全可以写在applicationContext.xml中的,不过那样会显得杂乱。
5、配置quartz的运行环境:quartz.properties文件(放在类路径下)
文件名必须叫此名字,其实此文件我们也可以不配置的。
- # 配置主调度器属性
- org.quartz.scheduler.instanceName = QuartzScheduler
- org.quartz.scheduler.instanceId = AUTO
- # 配置线程池
- # Quartz线程池的实现类
- org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
- # 线程池的线程数量
- org.quartz.threadPool.threadCount = 1
- # 线程池里线程的优先级
- org.quartz.threadPool.threadPriority = 10
- # 配置作业存储
- org.quartz.jobStore.misfireThreshold = 60000
- org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
如果我们不配置此文件的话,默认使用quartz-2.1.6.jar中的quartz.properties文件(在该压缩文件的org/quartz路径下),如果需要改变其运行属性,我们可以自己创建一个quartz.properties文件,并将该文件放在系统加载的类路径下,ClassLoader就会自动加载并启用其中的各种属性。
三、注意事项
在Spring配置和Quartz集成内容时,有两点需要注意
1、在<Beans>中不能够设置default-lazy-init="true",否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。
2、在<Beans>中不能够设置default-autowire="byName"的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入
Spring整合Quartz的更多相关文章
- 使用Spring整合Quartz轻松完成定时任务
一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...
- spring整合quartz并持久化
spring整合quartz有两种方式: 一.常见是使用配置文件,将定时任务保存到内存中 简单示例: <!-- 短信催还提醒任务调度 --> <bean id="overd ...
- Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...
- spring整合quartz时间任务调度框架
spring整合quartz框架 1.创建maven工程 2.导入jar包(pom.xml) <dependencies> <dependency> <groupId&g ...
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境) 转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...
- Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入
Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...
- 使用spring整合Quartz实现—定时器
使用spring整合Quartz实现—定时器(Maven项目做演示) 不基于特定的基类的方法 一,开发环境以及依赖的jar包 Spring 4.2.6.RELEASE Maven 3.3.9 Jdk ...
- Spring整合Quartz分布式调度
前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...
- Spring整合Quartz分布式调度(山东数漫江湖)
前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...
- 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】
初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...
随机推荐
- JAX-WS 学习一:基于java的最简单的WebService服务
JAVA 1.6 之后,自带的JAX-WS API,这使得我们可以很方便的开发一个基于Java的WebService服务. 基于JAVA的WebService 服务 1.创建服务端WebService ...
- iOS程序员对算法的要求
算法和数据结构(鉴于二者的关联,以下统称算法),对于程序员的重要性一直是个具有争议性的话题.有一些程序员内心对算法有着天然的排斥,面试当中一旦考察算法知识,会被不少程序员吐槽,但有部分公司又一直在坚持 ...
- javascript 将递归转化为循环
function tco(f) { var value; var active = false; var accumulated = []; return function accumulator() ...
- BOOST 线程完全攻略 - 结束语
modulethread扩展多线程破解通讯 全文介绍了3个boost::thread的扩展类,希望能给大家书写多线程代码带来便捷. thread -> controlled_module_ex ...
- [core java学习笔记][第六章接口与内部类]
接口域内部类 接口 描述类具有什么功能,不给出具体实现. 内部类 用于设计协作关系的类集合 代理 实现任意接口的对象. 6.1 接口 接口声明 public interface Comparable ...
- MySql命令——表相关
auto_increment //自动增长 primary key(id) //指定主键 select last_insert_id();//获得添加列的主键值 create table produc ...
- html5前端开发笔记-个人中心
简单的css自适应 PC端 *** 移动端 *** ) *** 一开始的想法就是模仿手机APP 的页面进行布局,首先得有个头部,然后是主题部分,然后加上2个按钮,分别是编辑和退出登录.先布出基本结构. ...
- JS 事件对象和事件冒泡
1.事件对象 js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源.事件发生时的鼠标位置.事件按键等. 事件对象的获取方法: IE中可以window.event直接获取,而Firefox ...
- iOS 之改变状态栏颜色
1.在工程中找到 info.plist 文件,点击“+”号,选择 View controller-based status bar appearance 并设为 NO 2.在 AppDelegate ...
- Mysql 6.7.7 + EntityFramework 5.0 Code First 不能 Update-Database 问题的解决
1.修改 Migrations/Configuration.cs 文件 namespace DataModel.Migrations { using System; using System.Data ...