文档章节

Spring整合Quartz(JobDetailBean方式)

Leons
 Leons
发布于 2015/08/04 17:10
字数 1362
阅读 82
收藏 2

一、Spring创建JobDetail的两种方式

   定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时任务开发的目的,总体说第二种对开发人员更方便!

   配置Spring的任务调度抽象层简化了任务调度,在Quartz的基础上提供了更好的调度对象。Spring使用Quartz框架来完成任务调度,创建Quartz的作业BeanJobDetail),有一下两种方法:

   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包和Spring-context-support.jar导入类路径。

     ###不用导入quartz.jar,千万不忘了导入spring-context-support-3.2.0.M2.jar:这是因为这种方式是利用SPring封装的Quartz类进行特定方法的实现。

我们用到的两个JobDetailorg.springframework.scheduling.quartz.JobDetailBeanorg.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

触发器:org.springframework.scheduling.quartz.CronTriggerBean ;调度器:org.springframework.scheduling.quartz.SchedulerFactoryBean 都来源于这个jar包。

   2、编写JobPunchJob该类必须继承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 mapjobDataAsMap)可通过JobExecutionContext (执行时传递)获取。JobDetailBean job data map的属性映射到job的属性。如例所示,如果jobPunchJob中包含一个empMgr属性,JobDetailBean将自动注入到JobPunchJob的实例中,可用于传递参数。如果不写明,就会报

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名称自动注入,必须通过明确引用注入


© 著作权归作者所有

共有 人打赏支持
Leons
粉丝 3
博文 42
码字总数 40935
作品 0
黄浦
架构师
私信 提问
Spring整合Quartz(JobDetailBean方式)

一、Spring创建JobDetail的两种方式 定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时...

Java编程思想
2014/01/16
0
1
使用cronTriggerBean子类,动态设置cronExpression(quartz +...

Quartz的使用前准备: 1.引入必要的jar包: quartzallxxx.jar 或者quartz_xxx.jar slf4japixx.jar quartz所需要的日志工具 quartz知识简单了解:2.quartz的两种作业存储方式: RAMJobStore,...

gerry_pang
2013/08/11
0
0
Spring Quartz任务调度

使用Quartz调度器 Quart使用Trigger、Job和JobDetail对象实现各种调度任务。对于Quartz背后的基本概念,参考http://quartz-scheduler.org。为了方便的目的,Spring提供一组类简化Quartz在基于...

Leech
2014/09/20
0
7
Spring定时任务的几种实现

Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,...

如月王子
2014/07/12
0
0
【Quartz】Integration with Spring

Spring目前支持两种定时任务集成,Timer(since JDK1.3)和Quartz,这篇主要说说Quartz。 将Quartz集成到Spring主要是通过创建FactoryBean并为其添加一些引用。 而且我们可以通过MethodInvokin...

runtimeErr
2014/06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
3
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
9
0
GPON网络故障处理手册

导读 为了方便广大网络工作者工作需要,特搜集以下GPON网络处理流程供大家学习参考。开始—初步定为故障—检查光纤状况—检查ONU状态--检查设备运行状态—检查设备数据配置—检查上层设备状态...

问题终结者
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部