背景:目前因工作需要,要实现WEB项目设计动态加载XML文件的功能。这些XML文件的数据是动态从数据库中获取到的,其中数据库中数据每一小时更新一次。因此需要每一小时动态生成XML文件。这就要用到JAVA中得任务调度功能。
总的来说,分为两部分:1.项目启动时通过servlet调度任务;2.通过JAVA QUARTS 每一小时进行一次任务调度。
项目架构:SSH(struts2+spring+hibernate)
言归正传,进入正题,开始讨论这两种方法的实现.
一 servlet 任务调度
1. web.xml 中servlet的配置
<servlet>
<servlet-name>CreateXmlForCharts</servlet-name>
<servlet-class>cn.gov.cma.servlet.CreateXmlForCharts</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CreateXmlForCharts</servlet-name>
<url-pattern>/XmlTools/CreateXmlForCharts</url-pattern>
</servlet-mapping>
2. servlet 的任务调度 方法
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String xpwd = request.getParameter("xpwd");
if (xpwd == null || !xpwd.equals("administrator"))
return;
System.out
.println("-------------CreateXmlForCharts------anytime ---------"
+ new Date());
// 获取SPRING中的<bean>节点的globalQueue队列对象。
WebApplicationContext webapplicationcontext = WebApplicationContextUtils
.getRequiredWebApplicationContext(this.getServletContext());
ICreateXmlForChartsService createxmlforchartsservice = (CreateXmlForChartsServiceImpl) webapplicationcontext
.getBean("createxmlforchartsservice");
long starta = System.currentTimeMillis();
List<Integer> list = createxmlforchartsservice.findAllStationID();// stationid
// 的list
// 之后按此list进行生成xml的动作.
long startb = System.currentTimeMillis();
System.out.println(startb - starta
+ "========findAllStationID======time");
System.out.println(list.size());
String[] hours = DateUtils.getTimeString(24);// 指定时间段字符串数组.
// for(String h:hours) System.out.println(h);
System.out.println("_+_+_+_+_+_+_+_");
String[] sbtime = DateUtils.getTimeBeginAndEndString(24);
// for(String h:sbtime) System.out.println(h);
long startc = System.currentTimeMillis();
Map<String, EleAwstPublicvo> map = createxmlforchartsservice
.findAllEleAwstPublic(sbtime[1], sbtime[0]);// 存放着指定时间段内,所有的stationid对应的实况信息.
long startd = System.currentTimeMillis();
System.out.println(startd - startc
+ "========findAllEleAwstPublic======time");
System.out.println(map.size());
int listsize = list.size();
Integer stationid;
List<EleAwstPublicvo> listEleAwstPublicvo;
PrintWriter out;
//String filepath = "/usr/product/apache-tomcat-6.0.32/webapps/productdb_flex/demo/";
String filepath = "D:/productdb/tomcat 6/webapps/productdb_flex/demo/";
File filefolder = new File(filepath);
if (!filefolder.exists())
filefolder.mkdirs();
for (int i = 0; i < listsize; i++) {
stationid = list.get(i);
listEleAwstPublicvo = CreateXml.getEleAwstPublicvolistByStationID(
stationid, map, hours);
if (stationid == 45011) {
for (EleAwstPublicvo o : listEleAwstPublicvo) {
System.out.println(o.getV01000() + "|" + o.getcBjtime()
+ "|" + o.getV12001() + "|" + o.getV11043() + "|"
+ o.getV11041() + "|" + o.getV13003() + "|"
+ o.getV13019());
}
}
out = new PrintWriter(
filepath + stationid + "temperature.xml", "gb2312");
CreateXml.createTemperatureXml(stationid, listEleAwstPublicvo, out);
out = new PrintWriter(
filepath + stationid + "humidity.xml", "gb2312");
CreateXml.createHumidityXml(stationid, listEleAwstPublicvo, out);
out = new PrintWriter(
// //"out\\"+ 需要就自己加上文件夹名称
filepath + stationid + "wind.xml", "gb2312");
CreateXml.createWindXml(stationid, listEleAwstPublicvo, out);
out = new PrintWriter(
filepath + stationid + "precipitation.xml", "gb2312");
CreateXml.createPrecipitationXml(stationid, listEleAwstPublicvo,
out);
}
long starte = System.currentTimeMillis();
System.out.println(starte - startd
+ "========compare and write xml======time");
}
关键点:
WebApplicationContext webapplicationcontext = WebApplicationContextUtils
.getRequiredWebApplicationContext(this.getServletContext());
ICreateXmlForChartsService createxmlforchartsservice = (CreateXmlForChartsServiceImpl) webapplicationcontext
.getBean("createxmlforchartsservice");
首先:通过SPRING提供的WebApplicationContextUtils 类方法得到WebApplicationContext的对象;
然后:通过WebApplicationContext对象得到service bean 对象;
之后就可以调用service方法,即业务方法。
很简单,是不是,(:-:)
二 QUARTS任务调度实现
1. 首先介绍一下QUARTS, Quartz是OpenSymphony提供的任务调度库类。借助一SPRING对QUARTS的很好的支持,可以很方便的使用这套任务调度库类。
以下是SPRING中QUARTS得配置:
<?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:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<!-- 要调用的工作类 -->
<bean id="quartzJob" class="cn.gov.cma.quartzs.CreateXmlForCharts">
<property name="createxmlforchartsservice" ref="createxmlforchartsservice"></property>
</bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="quartzJob"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>createXml</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobtask"/>
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<!-- 每隔2秒执行一次-->
<value>0 45 * * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime"/>
</list>
</property>
</bean>
<!-- 接收数据的servlet -->
</beans>
总的意思每个小时的第45分钟,系统会自动调用生成XML文件的方法。
2. 此方法以方面servlet的任务调度方法类似。
public void createXml() {
System.out
.println("-------------CreateXmlForCharts------quartzs ---------"
+ new Date());
long starta = System.currentTimeMillis();
List<Integer> list = createxmlforchartsservice.findAllStationID();// stationid
// 的list
// 之后按此list进行生成xml的动作.
long startb = System.currentTimeMillis();
System.out.println(startb - starta
+ "========findAllStationID======time");
System.out.println(list.size());
String[] hours = DateUtils.getTimeString(24);// 指定时间段字符串数组.
// for(String h:hours) System.out.println(h);
System.out.println("_+_+_+_+_+_+_+_");
String[] sbtime = DateUtils.getTimeBeginAndEndString(24);
// for(String h:sbtime) System.out.println(h);
long startc = System.currentTimeMillis();
Map<String, EleAwstPublicvo> map = createxmlforchartsservice
.findAllEleAwstPublic(sbtime[1], sbtime[0]);// 存放着指定时间段内,所有的stationid对应的实况信息.
long startd = System.currentTimeMillis();
System.out.println(startd - startc
+ "========findAllEleAwstPublic======time");
System.out.println(map.size());
int listsize = list.size();
Integer stationid;
List<EleAwstPublicvo> listEleAwstPublicvo;
PrintWriter out;
//String filepath = "/usr/product/apache-tomcat-6.0.32/webapps/productdb_flex/demo/";
String filepath = "D:/productdb/tomcat 6/webapps/productdb_flex/demo/";
File filefolder = new File(filepath);
if (!filefolder.exists())
filefolder.mkdirs();
try {
for (int i = 0; i < listsize; i++) {
stationid = list.get(i);
listEleAwstPublicvo = CreateXml
.getEleAwstPublicvolistByStationID(stationid, map,
hours);
/*
* if(i==500){ for(EleAwstPublicvo o:listEleAwstPublicvo ) {
* System
* .out.println(o.getV01000()+"|"+o.getcBjtime()+"|"+o.getV12001
* (
* )+"|"+o.getV11043()+"|"+o.getV11041()+"|"+o.getV13003()+"|"+o
* .getV13019()); } }
*/
out = new PrintWriter(
filepath + stationid + "temperature.xml", "gb2312");
CreateXml.createTemperatureXml(stationid, listEleAwstPublicvo,
out);
out = new PrintWriter(
filepath + stationid + "humidity.xml", "gb2312");
CreateXml
.createHumidityXml(stationid, listEleAwstPublicvo, out);
out = new PrintWriter(
// //"out\\"+ 需要就自己加上文件夹名称
filepath + stationid + "wind.xml", "gb2312");
CreateXml.createWindXml(stationid, listEleAwstPublicvo, out);
out = new PrintWriter(
filepath + stationid + "precipitation.xml", "gb2312");
CreateXml.createPrecipitationXml(stationid,
listEleAwstPublicvo, out);
}
} catch (IOException e) {
e.printStackTrace();
}
long starte = System.currentTimeMillis();
System.out.println(starte - startd
+ "========compare and write xml======time");
}
Over....
后续要补充一下java.util.Timer任务调度实现。