您的位置:首页 > 大数据 > 人工智能

Quartz中扩展MethodInvokingJobDetailFactoryBean实现对任务调度的拦截

2014-05-22 01:37 816 查看
利用Quartz来实现任务调度已经被广泛地应用了,一个利用Quartz来进行任务调度的典型配置如下:

若有多个任务需要调度,则配置多个JobDetail、Trigger即可,待执行的Task bean没有啥任何要求,不需要extends任何class、或者implements任何interface,只是被执行的method需要是无参数的;

但是在我们现实项目中,仅仅完成这样的功能是还不够的,我们还需要争取完成以下几点:

对所有的Task实现执行开始、结束时间的记录;
对每天的Task执行结果持久化、或者通过email、旺旺消息等方式告知相关owner;
当我们有多台Task服务器时,如何保证每个任务只在一台服务器上执行;
针对以上几个问题,我们也都有很简单、直接的办法可以搞定,比如说1、2两点可以直接在每个任务中各自编码完成,但是这样不仅每个task都要写非常类似的重复代码、而且不能保证每个任务的执行情况都被记录,因为某些task的编码人员就不会在意这些非功能性需求;对于第3点,我们也可以通过配置来完成向不同task服务器部署不一样的发布包来完成,但这给发布带来了麻烦,这意味着有多少台task服务器,就需要通过修改配置重新打包并发布多少次;

其实我们可以利用Spring默认提供的AOP来非常优雅的解决这几个问题:[b]扩展MethodInvokingJobDetailFactoryBean来实现任务调度时的拦截[/b]!其关键代码为MethodInvokingJobDetailFactoryBean.MethodInvokingJob.executeInternal(JobExecutionContext
context);这个method中;

具体步骤如下:

新增所有Task都需要实现的interface,可参考如下代码:
public interface TaskHandler {
/**
* <strong>任务调度</strong>执行需要<strong>实现</strong>的method
*/
TaskResult execute();
}

基于MethodInvokingJobDetailFactoryBean实现自定义的JobDetailFactoryBean,在具体执行待调度任务的method前后加入公用逻辑,比如记录开始、结束日期、判断该task是否由该台服务器执行、任务执行完成之后将运行结果进行持久化或者发email等给相关owner;可参考如下代码:
]<bean id="appsAbstractJobDetail" class="com.alisoft...AppsMethodInvokingJobDetailFactoryBean"
abstract="true">
<property name="concurrent" value="false" />
<property name="targetMethod" value="execute" />
</bean>
<bean id="testTaskHandler" class="com.alisoft...task.TestTaskHandler" />
<bean id="testTaskJobDetail" parent="appsAbstractJobDetail">
<property name="targetObject" ref="testTaskHandler" />
</bean>
<bean id="testTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testTaskJobDetail" />
<property name="cronExpression" value="0 10 0 * * ?" />
</bean>


详细请点击:http://www.verydemo.com/demo_c143_i19346.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐