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

来源:互联网 发布:python编程第四版豆瓣 编辑:程序博客网 时间:2024/06/06 08:35
一、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实例的该方法包装成任务的执行体。


二、实例(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.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://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>

三、实例()

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");}}



0 0
原创粉丝点击