Quartz学习(七)--Spring整合Quartz(JobDetailBean方式)

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

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配置文件

 





	
	
	


	
		
		
			
			
			
			
				
					
				
			
		
	
	
	



    
        
            
        
        
    

  job data map(jobDataAsMap)可通过JobExecutionContext (执行时传递)获取。JobDetailBean将 job data map的属性映射到job的属性。如例所示,如果job类PunchJob中包含一个empMgr属性,JobDetailBean将自动注入到Job类PunchJob的实例中,可用于传递参数。如果不写明,就会报
java.lang.NullPointerException错误,主要是因为没有注入Bean。

 

  在上面的配置中我们是让触发器和任务嵌套的,其实还可以将他们分离,形如:

  

          class="org.springframework.scheduling.quartz.JobDetailBean">

       

       
       
        com.gresoft.fileupload.service.ParseFileQuartz
       

       

        

        
         
           
           
       

         

       

  


    

            class="org.springframework.scheduling.quartz.CronTriggerBean">

         

       

     

            
       

       

       
            0/30 * * * * ?
       

   

  4、让容器加载quartz.xml

  在web.xml中添加:

  
        contextConfigLocation
        /WEB-INF/applicationContext.xml,/WEB-INF/quartz.xml
    


  ###其实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、中不能够设置default-lazy-init="true",否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。
           2、中不能够设置default-autowire="byName"的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入

你可能感兴趣的:(Quartz)