APP下载

Tomcat执行定时任务实现不同系统数据导入

2015-09-25叶均隆叶均明何银川

现代计算机 2015年9期
关键词:江门代码方法

叶均隆,叶均明,何银川

(1.广东南方职业学院信息技术系,江门 529000;2.江门中心医院,江门 529000;3.广东南方职业学院信息技术系,江门529000)

Tomcat执行定时任务实现不同系统数据导入

叶均隆1,叶均明2,何银川3

(1.广东南方职业学院信息技术系,江门 529000;2.江门中心医院,江门529000;3.广东南方职业学院信息技术系,江门529000)

0 引言

随着企业的发展,企业的信息化系统也越来越多,但新引入的系统往往需要实现新旧系统之间的数据联系,也有原来系统业务某些特定需求增加也可能需要不同系统的数据联系。那么实现企业不同系统数据传递有那些方法呢?据笔者了解通常有这些实现方法:消息中间件(如:JMS)、专用数据接口程序、Web Services等方法。但是根据笔者以往多年的实践经验,采用什么方法实际会根据企业集团需求以及系统的实际情况采用合适的方法。有些开发者在遇到这类似的问题的时候一般会考虑使用Web Services实现。但是也有不少是这些情况——集团企业只需一个信息系统向另一信息系统导入数据;每天有大量数据输入到一个系统里并且数据来自另一个系统或者多个系统。笔者多年的项目经历中都遇过。其中有一次,一企业引进的了某公司的系统,系统要求收集多个部门信息,这些信息一般都保存在各个部门正在使用的信息系统里。其中有一个系统正好是笔者负责的系统。提出需求是系统要把每小时生产的多个产品的成分信息定时导入新系统里。笔者也曾建议采用Web Services提供数据接口方法实现,但是对方的项目经理和相关技术人员则认为这样会增加新系统的负担和二次开发的工作量。深入分析,对方并非无理。企业每天生产的产品数量当然不少的,并且种类和成分构成也不尽相同,那么每天的数据量当然很多的,如果采用是Web Services,系统有三种方法实现:①需要的时候再调用Web Services获得数据,完成系统信息表现,数据没有导入系统中;②需要的时候再调用Web Services获得数据并导入系统中;③定时通过Web Services获得数据并导入系统。由于系统是产品型(即通用软件),方法①有可能导致系统多个模块的业务逻辑进行更改,并且功能实现困难、性能下降,显然不大可能采用;方法②业务逻辑则不需改动,只需增加数据导入的功能,但速度上却是软肋——系统每天生成很多数据,更何况他们的系统还需要集团多个系统的数据,往往分析报表则需要多个部门数据,如果加上很长时间没有触发导入,那么一旦触发时,生成的分析报表所使用的导入时间将是非常影响当时的工作效率的。方法③相比前面两种要好,但增加系统开发、维护、测试的工作量,带有杀鸡焉用牛刀意味,另外还增加系统日常负担,降低系统总体性能。因此,把数据导入任务交给具有原始数据的各系统完成。

1 数据导入怎样实现

如果不采用Web Service完成数据导入,开发专用数据接口程序,开发工作也不少。经过一段时间的思索,假设在Web服务器实现定时执行任务,问题就迎刃而解,通过查找并阅读大量相关文档,了解到Java的Timer类能实现定时引发事件——设置Timer类一定的时间间隔,那么在间隔之后会准时调用已经安排好的任务(TimerTask类)。由于考虑系统实用性,当系统重启时,系统能自动创建Timer对象并开始进行计划任务,实现每隔一小时进行一次数据格式转换并导入。那么用什么方式创建Timer对象是下一步要考虑的问题。如果在Servlet创建,需要在web.xml设置<load-onstartup>的值,理论是可行。设置代码:

上面代码”Xxx”,读者可根据所需替换自定义的类名。考虑程序的稳定性,Timer对象的宿主的生存周期应该为系统的生命周期,使用第二种方法ServletContext侦听器为宿主更适合。下面将详细介绍第二种方法:

(1)使用ServletContext侦听器要实现接口两个方法

(2)上述代码出现PutInContextListener类和PutIn-Bean类,它们的类名可以根据自己的需要自定义。PutInContextListener类是实现ServletContext侦听器的,而PutInBean类也需要自己创建,它主要是业务逻辑实现,如:上面所说的数据导入功能。PutInBean类参考代码如下:

上面代码中“//在这里开发……”为数据导入的功能实现地方,读者可以替换为自己要实现各类功能的程序代码。不同系统的数据导入要考虑两问题:①不同系统的数据格式一般是不一致的,需要相应地转换。②导入数据之前先判断哪些是已经导入的,哪些是没有导入的。另外私有静态变量isBusy是用来控制每次导入不能同一时间段有并行工作的(实际应用不会出现一个钟头以上的数据导入操作,但作为一个通用性代码有必要设置的)。数据导入是不能并行的,同一时间段进行很容易导致相同的数据重复导入,那么会造成本次导数的数据回滚,从而导致这次导数失败。本次导数运行完毕后,设置isBusy为false,下次导数则可以进行,设置isBusy为true则不行。其他的代码非常简单,不一一阐述。

(3)PutInContextListener类和PutInBean类开发完后,剩下就是部署PutInContextListener侦听器类。

当然,上面的dataPutIn.servlet换成读者自定义的包名。保存web.xml配置,把工程部署到服务器。启动服务,定时任务就会执行。

2 结语

实际上一般还需要日志记录运行结果,以方便日后系统维护,那么将PutInContextListener类里的System.out.println()替换为event.getServletContext().log()方法和PutInBean类里的System.out.println()替换为context. log()方法即可实现。

笔者也曾在其他异构系统里实现类似的数据导入功能,也试过开发专用程序和Web Service实现,但是开发较为复杂,如果此数据接口用在多个系统,那就比较适合,有些还需增加权限控制。类似本文的情况那么就使用Tomcat执行定时任务,将是不错实现方法。

[1]程炜.基于Web Service的一种分布式体系结构[J].四川:计算机应用研究,2002

[2]郑宁.JSP编程及案例分析[M].北京:清华大学出版社,2010

[3]关东升,田登山.JSP网络程序设计.北京:北京邮电大学出版社,2011

[4]高张.提高Tomcat服务器运行性能的研究[J].湖北:计算机与数字工程,2008

[5]耿祥义.Java2实用教程(第4版).北京:清华大学出版社,2012

[6]孙卫琴.Tomcat与Java Web开发技术详解.北京:电子工业出版社,2009

Timing Task;Data Import;Web Service;Timer;Servlet Context Listener

Tomcat Execute Timing Tasks to Achieve Different System Data Import

YE Jun-long1,YE Jun-ming2,HE Yin-chuan3
(1.Department of Information Technology,Guangdong Nanfang Vocational College,Jiangmen529000;2. Jiangmen Central Hospital,Jiangmen 529000;2.Department of Information Technology,Guangdong Nanfang Vocational College,Jiangmen 529000)

1007-1423(2015)09-0054-03

10.3969/j.issn.1007-1423.2015.09.013

叶均隆(1983-),男,广东省江门人,本科,助教,研究方向为计算机科学与技术和教育技术学

叶均明(1980-),男,广东江门人,本科,助理工程师,研究方向网络工程和医院信息化

何银川(1984-),男,河南周口人,研究生,助教,研究方向为计算机教育、软件工程、现代教育技术

2015-01-29

2015-03-03

重点介绍企业不同信息系统数据导入的其中一种实现方法,并比较其他实现方法的优劣,结合企业实际需求提出Tomcat执行定时任务实现不同系统数据导入。实现原理是通过PutInContextListener侦听器实现ServletContext Listener接口并装载Timer对象,Timer对象定时触发PutInBean对象相应的方法,实现数据的导入。

定时任务;数据导入;Web Service;Timer;ServletContext侦听器

Introduces a method to realize the import of data which between different enterprise information systems,and compared the other methods to realize the advantages and disadvantages,combined with the actual needs of enterprises,puts forward Tomcat execution timing task to achieve different system data import.The principle is to pass the PutInContextListener listener to implement the ServletContextListener interface and load the Timer object,timer object trigger timing method of the PutInBean object,to execute data import.

猜你喜欢

江门代码方法
精彩观影,欢乐K歌 江门开平优之名商务多功能影音室
“江门之心”——东甲立交方案设计
创世代码
创世代码
创世代码
创世代码
广东江门“多证合一”再开全国先河
福彩公益金 传递温暖情 走近江门福彩公益
用对方法才能瘦
四大方法 教你不再“坐以待病”!