Spring整合Quartz(JobDetailBean方式)

来源:互联网 发布:u盘安装linux系统 编辑:程序博客网 时间:2024/05/18 22:43

一、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包和Spring-context-support.jar导入类路径。
###不用导入quartz.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)

[java] view plain copypackage 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配置文件

[html] view plain copy<?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文件(放在类路径下)
文件名必须叫此名字,其实此文件我们也可以不配置的。

[html] view plain copy# 配置主调度器属性  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中的quart

z.properties文件(在该压缩文件的org/quartz路径下),如果需要改变其运行属性,我们可以自己创建一个quartz.properties文件,并将该文件放在系统加载的类路径下,ClassLoader就会自动加载并启用其中的各种属性。

三、注意事项
在Spring配置和Quartz集成内容时,有两点需要注意
1、在中不能够设置default-lazy-init=”true”,否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。
2、在中不能够设置default-autowire=”byName”的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入

阅读全文
0 0
原创粉丝点击