Spring 整合Quartz两种方式比较(JobDetailBean和MethodInvokingJobDetailFactoryBean方式)

Spring Quartz 任务调度
本文介绍Spring结合Quartz实现任务调度的两种方式:通过JobDetailBean及MethodInvokingJobDetailFactoryBean配置作业。前者需继承QuartzJobBean并实现executeInternal方法;后者则通过指定目标对象和方法来执行任务。

一、Spring创建JobDetail的两种方式

           配置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实例的该方法包装成任务的执行体。
concurrent:是否并发进行,false,表示不可以并发,其他进程延迟调用,一般用于定时调用多个程序时。

二、实例(JobDetailBean方式)

1、将spring核心jar包、quartz.jar和Spring-context-support.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配置文件
<?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"/>  
      
<span style="white-space:pre">    </span><!-- 定义触发器来管理任务Bean -->  
<span style="white-space:pre">    </span><bean id="cronTriggerPunch" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail">  
    <span style="white-space:pre">    </span><!-- 使用嵌套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>  

三、实例(MethodInvokingJobDetailFactoryBean方式)

1、配置文件:
<beans>  
    <!-- 调度工厂 -->  
    <bean id="scheduler" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="startupDelay" value="30"/>  
        <property name="triggers">  
             <list>  
                <!--<ref bean="exposureTrigger"/>-->  
            </list>   
        </property>  
    </bean>  
      
    <!-- 定义触发时间 -->  
    <bean id="exposureTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
        <property name="jobDetail" ref="exposureDetail"></property>  
        <property name="cronExpression">  
            <value>*/5 * * * * ?</value>  
        </property>  
    </bean>  
      
    <!-- 自定义任务 -->  
    <bean id="exposureDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <property name="targetObject" ref="adResourceServiceImpl"></property>  
        <property name="targetMethod" value="executeExposure"></property>  
        <property name="concurrent" value="false" />  
          
    </bean>  
</beans>  
注:使用了spring的注解方式,这里adResourceServiceImpl 业务bean不需要定义了。

2、java类
public void executeExposure() throws Exception{  
        //1获取可变现的广告位  
        List<AdResource> listIis = adResourceIisDao.selectParam(new HashMap());  
          
        for (AdResource ad : listIis) {  
            Long id = ad.getId();  
              
            Integer expValue = adResourceIamsDao.count(id, "getExposureValue");  
            if (expValue != null) {  
                Map map = new HashMap();  
                map.put("expValue", expValue);  
                map.put("id", id);  
                adResourceIisDao.updateParam(map,"updateExp");  
            }  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值