葉均隆,葉均明,何銀川
(1.廣東南方職業學院信息技術系,江門 529000;2.江門中心醫院,江門 529000;3.廣東南方職業學院信息技術系,江門529000)
Tomcat執行定時任務實現不同系統數據導入
葉均隆1,葉均明2,何銀川3
(1.廣東南方職業學院信息技術系,江門 529000;2.江門中心醫院,江門529000;3.廣東南方職業學院信息技術系,江門529000)
隨著企業的發展,企業的信息化系統也越來越多,但新引入的系統往往需要實現新舊系統之間的數據聯系,也有原來系統業務某些特定需求增加也可能需要不同系統的數據聯系。那么實現企業不同系統數據傳遞有那些方法呢?據筆者了解通常有這些實現方法:消息中間件(如:JMS)、專用數據接口程序、Web Services等方法。但是根據筆者以往多年的實踐經驗,采用什么方法實際會根據企業集團需求以及系統的實際情況采用合適的方法。有些開發者在遇到這類似的問題的時候一般會考慮使用Web Services實現。但是也有不少是這些情況——集團企業只需一個信息系統向另一信息系統導入數據;每天有大量數據輸入到一個系統里并且數據來自另一個系統或者多個系統。筆者多年的項目經歷中都遇過。其中有一次,一企業引進的了某公司的系統,系統要求收集多個部門信息,這些信息一般都保存在各個部門正在使用的信息系統里。其中有一個系統正好是筆者負責的系統。提出需求是系統要把每小時生產的多個產品的成分信息定時導入新系統里。筆者也曾建議采用Web Services提供數據接口方法實現,但是對方的項目經理和相關技術人員則認為這樣會增加新系統的負擔和二次開發的工作量。深入分析,對方并非無理。企業每天生產的產品數量當然不少的,并且種類和成分構成也不盡相同,那么每天的數據量當然很多的,如果采用是Web Services,系統有三種方法實現:①需要的時候再調用Web Services獲得數據,完成系統信息表現,數據沒有導入系統中;②需要的時候再調用Web Services獲得數據并導入系統中;③定時通過Web Services獲得數據并導入系統。由于系統是產品型(即通用軟件),方法①有可能導致系統多個模塊的業務邏輯進行更改,并且功能實現困難、性能下降,顯然不大可能采用;方法②業務邏輯則不需改動,只需增加數據導入的功能,但速度上卻是軟肋——系統每天生成很多數據,更何況他們的系統還需要集團多個系統的數據,往往分析報表則需要多個部門數據,如果加上很長時間沒有觸發導入,那么一旦觸發時,生成的分析報表所使用的導入時間將是非常影響當時的工作效率的。方法③相比前面兩種要好,但增加系統開發、維護、測試的工作量,帶有殺雞焉用牛刀意味,另外還增加系統日常負擔,降低系統總體性能。因此,把數據導入任務交給具有原始數據的各系統完成。
如果不采用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配置,把工程部署到服務器。啟動服務,定時任務就會執行。
實際上一般還需要日志記錄運行結果,以方便日后系統維護,那么將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.