任务调度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
2 applicationContext.xml
MethodInvokingJobDetailFactoryBean中的concurrent属性,跟Quartz中的有无状态是一致的。concurrent为true,相当于无状态的任务,可以并发执行,且concurrent默认值为true;如果禁止并发执行,则将concurrent改成false就可以了。
上面的applicationContext.xml也给出了CronTrigger的Demo。
运行结果如下所示:
是不是要使用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。
运行结果如下所示:
相关文章推荐
- 创建Material样式卡片风格注意事项
- APP是什么? 为什么叫APP APP全称是什么
- Vert.x 3学习笔记---09
- Android 欢迎引导页的魅力
- TCP/IP协议详解:卷一----笔记(1)概述
- Android 快速开发框架:推荐10个框架
- C#创建唯一的订单号, 考虑时间因素
- memcached的缺点
- 1143 多少个Fibonacci数
- Windows下编译最新volley jar包
- python beautifulsoup简单用法
- iOS Implicit declaration of function XXX is invalid in C99”
- matlab的parcorr函数
- 《二月英语激情飞扬》
- CREATE TABLE 表名 AS SELECT 语句
- ubuntu android jdk问题
- angularJs学习笔记-路由
- nw.js node-webkit系列(4)Native UI API 概述和应用规范
- 在Viewpager中的Fragment使用ContextMenu问题
- HttpURLConnection类