web 项目 任务调度 Spring整合Quartz(JobDetailBean方式)

 

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

2、编写Job类SyncJobSerivce 该类必须继承QuartzJobBean


package com.kayak.quartz.base.service;

import java.util.Date;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * 任务调动
 * @author OF
 * 2015年7月6日
 */
public class SyncJobSerivce extends QuartzJobBean {
 
//该作业类所依赖的业务逻辑组件  
    private JobTestService jobTestService;  
    private JobServiceTest jobServiceTest;
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
jobTestService.jobTest();
jobServiceTest.test();
}
public void setJobServiceTest(JobServiceTest jobServiceTest) {
this.jobServiceTest = jobServiceTest;
}

public JobTestService getJobTestService() {
return jobTestService;
}

public void setJobTestService(JobTestService jobTestService) {
this.jobTestService = jobTestService;
}

}
3、配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 总管理类 调度类-->
    <bean id="quartzScheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="applicationContextSchedulerContextKey" value="applicationContext" />
        <property name="configLocation" value="classpath:quartz.properties" />
        <!-- <property name="dataSource"> <ref bean="dataSource" /> </property> -->
        <property name="triggers">
            <list>
<!--                 <ref bean="triggerSimp" /> -->
                
                <ref bean="projectFreshJob" />
                <ref bean="jobService" />
            </list>
        </property>
    </bean>
   
     <!-- 定义调用对象和调用对象的方法 -->
    <bean id="jobDetaild" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass">
            <value>com.kayak.quartz.base.service.SyncJobSerivce</value>
        </property>
        <property name="jobDataAsMap">
            <map>
                <entry key="jobTestService">
                    <ref bean="jobTestService" />
                </entry>
                <entry key="jobServiceTest">
                    <ref bean="jobServiceTest" />
                </entry>
            </map>
        </property>
    </bean>
     <!-- 定义触发时间 -->
    <bean id="jobService" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetaild" />
        <property name="cronExpression" value="0/3 * * * * ?" />
    </bean> -->
    <!-- <bean id="jobTest" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0/5 * * * ?" />
    </bean>  -->
    <!--      <bean id="projectFreshJob" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetaild" />
        <property name="cronExpression" value="0 0/2 * * * ?" />
        <property name="cronExpression" value="0/2 * * * * ?" />
    </bean>  -->
    <bean id="simpleService" class="com.kayak.quartz.base.service.SyncCardBinSerivce" />
    <bean id="jobTestService" class="com.kayak.quartz.base.service.JobTestService" />
    <bean id="syncJobSerivce" class="com.kayak.quartz.base.service.SyncJobSerivce" />
    <bean id="jobServiceTest" class="com.kayak.quartz.base.service.JobServiceTest" />
    <bean id="projectFreshJobService" class="com.kayak.quartz.base.service.ProjectFreshJobService" />
</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>

 5、配置quartz的运行环境:quartz.properties文件(放在类路径下)

#==============================================================    
#Configure Main Scheduler Properties    
#==============================================================     
org.quartz.scheduler.instanceName = quartzScheduler  
org.quartz.scheduler.instanceId = AUTO  
  
#==============================================================    
#Configure JobStore    
#==============================================================   
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
#org.quartz.jobStore.tablePrefix = QRTZ_  
#org.quartz.jobStore.isClustered = true  
#org.quartz.jobStore.clusterCheckinInterval = 20000    
   
#==============================================================    
#Configure ThreadPool    
#==============================================================   
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
org.quartz.threadPool.threadCount = 10  
org.quartz.threadPool.threadPriority = 5  
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true  


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值