方鐘亮
(昆山市廣播電視臺 網絡中心,江蘇 昆山 215300)
隨著信息技術的發展,有線電視網絡運營商大都建立起了如BOSS,OA等運維管理系統[1],但是對于某些設備資源,包括收費計算機終端、光纖管道、節點機房的運維管理缺乏一個有效的信息化管理平臺,這使得運營商在設備資源管理中經常重復作業,無法進行精確統計和合理部署。筆者介紹了基于Struts2,Spring和Hibernate開源框的終端運維管理系統設計,實現了面向終端運維的信息化統一管理平臺。
根據在終端運維工作中涉及的內容,系統在功能上的總體設計如圖1所示。系統包括運維記錄管理、終端設備管理、IP地址管理、文件下載管理和機構設置管理。系統的訪問分為普通用戶和管理員,普通用戶只能對上述功能的記錄信息進行查看和搜索,管理員則可以進行記錄的增加、刪除和編輯功能,普通用戶和管理員之間可以通過登錄、注銷進行切換。
系統的結構如圖2所示,由表示層、服務層和持久層組成,表示層用于處理系統數據和用戶之間的交互和數據圖表的顯示。服務層完成系統具體事務的托管處理。持久層可以實現系統和數據庫之間的訪問管理。

表示層基于Struts2框架。Struts2是Apache Software Foundation下設的一個開源項目,是基于MVC模式的一個Java輕量級Web應用程序框架,支持通過攔截器來處理用戶請求[2]。表示層通過JSP和Struts2標簽等技術直接將數據展示于用戶IE界面。用戶的HTTP請求會通過核心控制器FilterDispatcher根據struts.xml配置文件的定義分發到對應的Action類,Action類則通過調用服務層接口來完成相應業務處理。Action類的函數執行后返回字符串值,并在配置文件的

服務層基于Spring框架。Spring是一個輕量級的控制反轉(Inversion of Control,IoC)技術的容器框架,Spring實現了J2EE框架中所倡導的由容器實現對象生命周期管理的功能[3]。通過Web.xml文件的配置,IoC容器在應用服務器啟動時得以初始化。配置文件applicationContext.xml中注冊定義了數據源、會話工廠、服務層接口和數據接口對象(Data Access Object,DAO),各管理類都以Bean的形式進行注冊,并同容器一起初始化。系統中各接口類在被調用現場無需進行對象初始化,而是通過依賴注入的方式由IoC容器提供,這樣就能實現軟件設計中各組件之間的“松散耦合”[4]。
持久層基于Hibernate框架,Hibernate是一種開源持久層框架,能夠通過在數據庫表和簡單舊式Java對象類(Plain Ordinary Java Objects,POJO)之間建立對象和關系數據庫之間映射(Object Relational Mapping,ORM)來實現對數據庫的面向對象操作。Hibernate的查詢語句HQL是對SQL的面向對象擴展。Hibernate將數據庫中的每張表通過定義classname.hbm.xml配置文件映射到相應的POJO對象類,配置文件的類名稱需和POJO類名稱相同,Hibernate通過在DAO接口中使用HQL語句來實現POJO對象和數據庫之間的訪問。Hibernate的應用極大簡化了J2EE持久層的開發工作[5]。
Struts2標簽庫中的iterator標簽用于頁面迭代的輸出集合元素,但目前iterator標簽還無法處理大批量數據的分頁顯示。筆者在業務邏輯控制模塊中實現分頁控制,處理流程如圖3所示。首先,通過DAO接口查詢符合條件的所有記錄,并以集合的形式存儲在緩存中;其次,通過計算獲取單個頁面需要顯示的記錄在查詢集合中的起始位置和終止位置,并由此在內存中截取生成一個新子集;最后,將新生成的集合一并提交給iterator標簽予以顯示。圖中 pageIndex為頁面指針(初始值為1),pageSize為頁面顯示記錄數量,listSize為查詢集合中所有記錄數量,p為每次顯示記錄在查詢集合中的起始指針,e為結尾指針。

上下翻頁控制中上、下頁指針值prePage和nextPage的計算公式為

式中:pageNum代表總頁數,可根據記錄數和頁面大小來計算,在此不作介紹。翻頁過程中,上、下頁指針的值被賦給pageIndex,然后執行圖3所示的流程來實現數據分頁顯示。
在業務邏輯控制模塊中進行分頁處理,相對于其他模塊更增加了系統的解耦合度,對表示層的頁面控制也更加靈活。
大批量數據的處理涉及到系統的效率和穩定性,在持久層處理批量數據的方法通常有:
1)通過JDBC來執行原始SQL語句,此種方法最直接高效,但缺少面向對象的數據庫管理,在修改數據時無法保證緩存中Java對象與數據庫中數據的一致性,不利于代碼的移植和系統的擴展。
2)通過循環語句調用ibernateTemplate對象的Save,SaveorUpdate和Delete方法來實現批量處理數據。Hibernate對象的一級緩存只是構建在內存中,在數據量過大時多次調用Save接口可能會導致內存溢出,需要及時刷新一級緩存或是建立二級緩存。同時在更新或刪除數據時每次還要執行查詢語句,這種方法效率低下,且容易導致系統出錯。
3)利用Hibernate3中提供的用于批量數據處理的HQL語句接口。其處理方式代碼如下:

以上的處理方式無須對每個記錄進行查詢取出再修改保存,避免了內存溢出,并保持對象數據的一致性,在性能上和直接用JDBC進行操作相差無幾。文中的系統設計采用第3種批量處理方式。
系統采用JFreeChart技術進行統計數據的圖形化顯示。JFreeChart是基于Java的開源圖表軟件開發包,可融入所有Java程序中。JFreeChart可以生成如餅圖、柱狀圖和折線圖等多種統計圖表,并以JPEG或PNG文件格式保存。用JFreeChart生成統計圖表的流程為:1)數據查詢。服務器接受用戶客戶端的查詢請求,調用接口查詢數據庫原始數據,并將數據返回至業務邏輯控制模塊,再通過分析計算得到用戶需要的統計數據。2)創建數據集。通過DefaultCategoryDataset類創建圖像數據集DataSet對象,將統計數據賦予數據集。此時數據集成為圖表的數據源。3)創建JFreeChart對象。通過ChartFactory工廠類來創建JFreeChart對象,其數據源指向DataSet,并設置圖表對象的顏色、標題和字體等。4)圖像生成顯示。通過ServletUtilites類在服務端將圖表保存為PNG格式的臨時文件,并傳送至客戶端瀏覽器顯示[6]。
圖4是2009年昆山廣電全年運維記錄的查詢統計結果。系統通過Web的方式將動態數據以圖表形式顯示,使用戶一目了然,可以直接觀察數據變化趨勢。

終端運維管理系統在企業管理中的部署應用如圖5所示,系統通過對運維施工的詳細記錄并進行類別統計分析,向企業管理者提供各種明確的運維信息指標,管理層可及時有針對性地調整管理策略、排除隱患,實現更為有效的運營管理。

從圖4來看,票據打印和業務軟件的維修施工在所有運維種類中比例較高,具有代表性,涉及打印機硬件設備的維修和職員對業務軟件誤操作的更正指導。針對這些問題,可逐步進行打印設備的更新和員工的業務操作培訓。其效果可以從昆山廣電2009年各季度運維統計(表1)中體現,自一季度至四季度兩種類型運維比例分別從53.1%和28.1%逐季度降至13.0%和21.7%。這說明針對性的措施使得兩種故障發生比例明顯減小。

表1 季度運維統計
介紹了終端運維管理系統基于Struts2,Spring和Hibernate框架的開發設計。3種開源框架的整合符合J2EE分層設計的理念。同時系統利用開源JFreeChart實現了統計數據的圖形化展示。系統具有較高的可擴展性和良好的可維護性。終端運維管理系統實現了對運營終端的有效信息化管理,提供了一個面向設備運維的基礎管理平臺。在后續的開發中將逐步把廣電網絡運營所涉及的光纖管道和節點機房的管理融入到平臺中。
[1]方鐘亮.昆山廣電BOSS系統的策略管理建設[J].電視技術,2009,33(3):52-53.
[2]Apache Software Foundations.About apache struts2[EB/OL].[2009-10-01].http://struts.apache.org/2.0.11/.2009-10-1.
[3]Spring Source.Spring documentation[EB/OL].[2009-10-01].http://www.springsource.org/documentation.
[4]楊少波.J2EE項目實訓Spring框架技術[M].北京:清華大學出版社,2008.
[5]王軍豪,彭巖.Hibernate+Struts+Spring整合技術在電子政務中的應用[J].計算機工程與設計,2008,29(6):1409-1412.
[6]朱賀新,穆榮,盧建軍.JFreeChart的應用開發與改進[J].西安科技大學學報,2008,28(4):789-792.