您的位置:首页 > 其它

任务调度Quartz初探Demo(三)

2016-02-24 15:55 288 查看
上一篇博文任务调度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。

运行结果如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: