zoukankan      html  css  js  c++  java
  • Spring创建JobDetail的两种方式

    一、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)

    [java]  view plain copy
     
    1. package org.crazyit.hrsystem.schedule;  
    2.   
    3. import java.util.Date;  
    4. import org.springframework.scheduling.quartz.QuartzJobBean;  
    5. import org.quartz.JobExecutionContext;  
    6. import org.quartz.JobExecutionException;  
    7.   
    8. import org.crazyit.hrsystem.service.EmpManager;  
    9.   
    10. public class PunchJob  
    11.     extends QuartzJobBean   
    12. {  
    13.     //判断作业是否执行的旗标  
    14.     private boolean isRunning = false;  
    15.     //该作业类所依赖的业务逻辑组件  
    16.     private EmpManager empMgr;  
    17.     public void setEmpMgr(EmpManager empMgr)  
    18.     {  
    19.         this.empMgr = empMgr;  
    20.     }  
    21.     //定义任务执行体  
    22.     public void executeInternal(JobExecutionContext ctx)   
    23.         throws JobExecutionException   
    24.     {  
    25.         if (!isRunning)  
    26.         {  
    27.             System.out.println("开始调度自动打卡");  
    28.             isRunning = true;  
    29.             //调用业务逻辑方法  
    30.             empMgr.autoPunch();  
    31.             isRunning = false;  
    32.         }  
    33.     }  
    34. }  

       3、编写quartz.xml配置文件

    [html]  view plain copy
     
    1. <?xml version="1.0" encoding="GBK"?>  
    2. <!-- 指定Spring配置文件的Schema信息 -->  
    3. <beans xmlns="http://www.springframework.org/schema/beans"  
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    5.     xmlns:aop="http://www.springframework.org/schema/aop"  
    6.     xmlns:p="http://www.springframework.org/schema/p"  
    7.     xmlns:tx="http://www.springframework.org/schema/tx"  
    8.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    9.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    10.     http://www.springframework.org/schema/tx   
    11.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
    12.     http://www.springframework.org/schema/aop   
    13.     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"  
    14.         default-lazy-init="false">  
    15.   
    16.     <!-- 定义<span style="font-family:'courier new','courier';">一</span>个业务逻辑组件,继承业务逻辑组件的模板 -->  
    17.     <bean id="empManager"  
    18.         class="org.crazyit.hrsystem.service.impl.EmpManagerImpl"  
    19.         parent="managerTemplate"/>  
    20.       
    21. <!-- 定义触发器来管理任务Bean -->  
    22. <bean id="cronTriggerPunch"   
    23.     class="org.springframework.scheduling.quartz.CronTriggerBean">  
    24.     <property name="jobDetail">  
    25.         <!-- 使用嵌套Bean的方式来定义任务Bean -->  
    26.         <bean  
    27.         class="org.springframework.scheduling.quartz.JobDetailBean">  
    28.             <!-- 指定任务Bean的实现类 -->  
    29.             <property name="jobClass"   
    30.                 value="org.crazyit.hrsystem.schedule.PunchJob"/>  
    31.             <!-- 为任务Bean注入属性 -->  
    32.             <property name="jobDataAsMap">  
    33.                 <map>  
    34.                     <entry key="empMgr" value-ref="empManager"/>  
    35.                 </map>  
    36.             </property>  
    37.         </bean>  
    38.     </property>  
    39.     <!-- 指定Cron表达式:周一到周五7点、12点执行调度 -->  
    40.     <property name="cronExpression"   
    41.         value="0 0 7,12 ? * MON-FRI"/>  
    42. </bean>  
    43. <!-- 执行实际的调度器-->  
    44. <bean   
    45. class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    46.     <property name="triggers">  
    47.         <list>  
    48.             <ref bean="cronTriggerPunch"></ref>  
    49.         <!--    <ref local="cronTriggerPunch"/> 两者都可以用 -->  
    50.         </list>  
    51.     </property>  
    52. </bean>  
    53. </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
     
    1. # 配置主调度器属性  
    2. org.quartz.scheduler.instanceName = QuartzScheduler  
    3. org.quartz.scheduler.instanceId  = AUTO  
    4. # 配置线程池  
    5. # Quartz线程池的实现类  
    6. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
    7. # 线程池的线程数量  
    8. org.quartz.threadPool.threadCount = 1  
    9. # 线程池里线程的优先级  
    10. org.quartz.threadPool.threadPriority = 10  
    11. # 配置作业存储  
    12. org.quartz.jobStore.misfireThreshold = 60000  
    13. 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名称自动注入,必须通过明确引用注入

  • 相关阅读:
    comparator接口与Comparable接口的区别
    heap和stack有什么区别
    聚集索引和非聚集索引(整理)
    SQL里的EXISTS与in、not exists与not in
    SQL中CONVERT转化函数的用法
    GCC 对C语言的扩展
    C++宏定义详解
    How to Find Processlist Thread id in gdb !!!!!GDB 使用
    Netdata----Linux 性能实时监测工具
    java开发C语言编译器
  • 原文地址:https://www.cnblogs.com/sdream/p/5209182.html
Copyright © 2011-2022 走看看