Spring结合Quartz进行任务调度

Job和JobDetail类定义

使用JobDetailFactoryBean

XML配置文件

<bean name="exampleJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.wilson.demo.job.ExampleJob"></property>
    <property name="jobDataAsMap">
        <map>
            <entry key="timeOut" value="5"></entry>
        </map>
    </property>
</bean>

jobClass:制定任务对应的类,该类必须继承QuartzJobBean抽象类;
jobDataAsMap:数据承载类,该Map中的属性可注入到jobClass中。

ExampleJob.java

public class ExampleJob extends QuartzJobBean{
    private int timeOut;
    /**
     * @param timeOut the timeOut to set
     */
    public void setTimeOut(int timeOut) {
        this.timeOut = timeOut;
    }

    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println("ExampleJob>>>>TimeOut value:"+timeOut+",Job running time:"+context.getFireTime());
    }

}

使用MethodInvokingJobDetailFactoryBean

XML文件

<bean name="pojoObject" class="com.wilson.demo.job.PoJoExampleJob"></bean>
<bean name="methodJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="pojoObject"></property>
    <property name="targetMethod" value="runForJob"></property>
    <property name="concurrent" value="false"></property>
</bean>

pojoObject:任务执行类,普通POJO类,不用实现任何接口。需要注意的时,如果该Bean的生命周期是Singleton,则每次任务执行时,都是同一个Bean实例。
targetObject:制定任务的执行类;
targetMethod:制定执行任务时调用的方法;
concurrent:前一个任务未结束时,下一次调用能否开始。

两种方式的比较

JobDetailFactoryBean

  • 必须继承QuartzJobBean抽象类;
  • 支持往任务执行类中注入属性,任务执行类能获取执行时的上下文环境;
  • 通过该工厂Bean创建的JobDetail对象能够序列化,支持持久性的任务,同时,每一次任务调用时均生成新的任务类实例;
  • 每次任务调用时,共享同一个JobDetail实例。

MethodInvokingJobDetailFactoryBean

  • 支持普通POJO对象,无需继承QuartzJobBean;
  • 生成的JobDetail bean无法持久化,不支持持久性的任务;
  • 如果targetObject引用的Bean是Singleton,则每次任务调用时,均使用相同的实例bean;
  • 每次任务调用时,共享同一个JobDetail实例。

定义Trigger和Scheduler

XML配置

<!-- 简单的Trigger配置,启动延时为10秒,每5秒执行一次任务 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail" ref="methodJobDetail"></property>
    <property name="startDelay" value="10000"></property>
    <property name="repeatInterval" value="500000000"></property>
</bean>

<!-- 支持表达式的Trigger,每周五,每分钟的第5秒开始,每7秒执行一次,每分钟执行7次 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="exampleJobDetail"></property>
    <property name="cronExpression" value="5/7 * * ? * 6"></property>
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger"/>
            <ref bean="simpleTrigger"/>
        </list>
    </property>
</bean>

Scheduler是具体的任务调度器,而Trigger作为触发器会关联具体的JobDetail对象,通过JobDetail对象知道具体的任务执行类。
CronTrigger的表达式规则:(摘自官方文档-传送门
表达式规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值