现在的位置: 首页 > 综合 > 正文

在Spring中使用Quartz进行任务调度(3)

2013年03月26日 ⁄ 综合 ⁄ 共 1118字 ⁄ 字号 评论关闭

MethodInvokingJobDetailFactoryBean

    通常情况下,任务都定义在一个业务类方法中。这时,为了满足Quartz Job接口的规定,还需要定义一个引用业务类方法的实现类。为了避免创建这个只包含一行调用代码的Job实现类,Spring为我们提供了MethodInvokingJobDetailFactoryBean,借由该FactoryBean,我们可以将一个Bean的某个方法封装成满足Quartz要求的Job。来看一个具体的例子:

<bean id="jobDetail_1"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myService" /> ① 引用一个Bean
<property name="targetMethod" value="doJob" /> ② 指定目标Bean的方法
<property name="concurrent" value="false" /> ③ 指定最终封装出的任务是否有状态
<bean id="myService" class="com.baobaotao.service.MyService"/>

    jobDetail_1将MyService#doJob()封装成一个任务,同时通过concurrent属性指定任务的类型,默认情况下封装为无状态的任务,如果希望目标封装为有状态的任务,仅需要将concurrent设置为false就可以了。Spring通过名为concurrent的属性指定任务的类型,能够更直接地描述到任务执行的方式(有状态的任务不能并发执行,无状态的任务可并发执行),对于不熟悉Quartz内部机制的用户来说,比起statefule,concurrent显然更简明达意些。

MyService服务类拥有一个doJob()方法,它的代码如下所示:

package com.baobaotao.service; public class MyService { public void doJob(){①被封装成任务的目标方法 System.out.println("in MyService.dojob()."); } }

    doJob()方法即可以是static,也可以是非static的,但不能拥有方法入参。通过MethodInvokingJobDetailFactoryBean产生的JobDetail不能被序列化,所以不能被持久化到数据库中的,如果希望使用持久化任务,则你只能创建正规的Quartz的Job实现类了。

抱歉!评论已关闭.