任务调度Quartz初探Demo(三)

本文介绍如何使用Spring的MethodInvokingJobDetailFactoryBean简化Quartz任务调度配置,避免直接实现Job接口,通过示例展示了定时任务的创建过程。

上一篇博文任务调度Quartz初探Demo(二) 介绍了一个中规中矩的Quartz Demo。这篇博文介绍Spring提供的一种实现Job的方式。
是不是要使用Quartz,就必须要实现Job接口或者StatefulJob接口?如果有一个现成的类,其中有一个方法需要被多次调度周期执行,那我要把这个类拿出来实现一个Job接口吗?这岂不是有些麻烦。下面看看Spring提供的方法——MethodInvokingJobDetailFactoryBean。它可以将一个类中的某个方法封装成满足Quartz要求的Job。注意,这个方法不可以有入参,而且MethodInvokingJobDetailFactoryBean产生的JobDetail不能被序列化,所以不能被持久化数据库中,如果要持久化到数据库中还是要使用Demo(二)中规中矩的方式。

工程结构、pom.xml、TypeConfig.java、TypeConfigList.java、Main.java、config.xml请见任务调度Quartz初探Demo(二)

1 XmlParser.java

package org.fan.test.xstream;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Created by fan on 16-1-18.
 */
public class XmlParser {

    XStream xStream = new XStream(new DomDriver());
    TypeConfigList typeConfigList;

    public void initParser() {
        xStream.alias("TypeConfigs", TypeConfigList.class);
        xStream.alias("TypeConfig", TypeConfig.class);
        xStream.addImplicitCollection(TypeConfigList.class, "typeConfigList");
    }

    public void readConfigFile() {

        System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

        String path = XmlParser.class.getResource("/").getPath();
        FileInputStream pusherInputStream = null;
        try {
            pusherInputStream = new FileInputStream(path + "config.xml");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        typeConfigList = (TypeConfigList) xStream.fromXML(pusherInputStream);
        for (TypeConfig typeConfig : typeConfigList.getTypeConfigList()) {
            long[] datas = typeConfig.getDatas();
            for (int i = 0; i < datas.length; i++) {
                System.out.println(datas[i]);
            }
        }
    }

}

2 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       ">

    <bean id="xmlParser" class="org.fan.test.xstream.XmlParser"
          init-method="initParser"/>

    <bean id="readConfigXmlJob"
         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
         p:targetObject-ref="xmlParser"
         p:targetMethod="readConfigFile"
         p:concurrent="false">
    </bean>


    <bean id="simpleTriggerSpring" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
          p:jobDetail-ref="readConfigXmlJob"
          p:startDelay="3000"
          p:repeatInterval="5000"
          p:repeatCount="100">
        <property name="jobDataAsMap">
            <map>
                <entry key="count" value="10"/>
            </map>
        </property>
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"
          p:jobDetail-ref="readConfigXmlJob"
          p:cronExpression="0/5 * * ? * *"/>

    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="simpleTriggerSpring"/>
                <!--<ref bean="cronTrigger"/>-->
            </list>
        </property>

        <property name="schedulerContextAsMap">
            <map>
                <entry key="timeout" value="30"/>
            </map>
        </property>
    </bean>


</beans>

MethodInvokingJobDetailFactoryBean中的concurrent属性,跟Quartz中的有无状态是一致的。concurrent为true,相当于无状态的任务,可以并发执行,且concurrent默认值为true;如果禁止并发执行,则将concurrent改成false就可以了。

上面的applicationContext.xml也给出了CronTrigger的Demo。

运行结果如下所示:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值