冉崇善, 王 琦
(陜西科技大學(xué)電氣與信息工程學(xué)院, 陜西 西安 710021)
企業(yè)資產(chǎn)管理系統(tǒng),簡(jiǎn)稱EAMS(Enterprise Asset Management System),是一個(gè)面向資產(chǎn)密集型企業(yè)的信息化解決方案,以提高資產(chǎn)利用率、降低企業(yè)運(yùn)維成本為目標(biāo),從而幫助企業(yè)提高其經(jīng)濟(jì)效益和市場(chǎng)競(jìng)爭(zhēng)力.
隨著信息化的推進(jìn)和發(fā)展,EAMS已由最初的單機(jī)C/S架構(gòu)轉(zhuǎn)變?yōu)闃I(yè)界普遍使用的B/S架構(gòu),該架構(gòu)能較好地滿足企業(yè)的分布式應(yīng)用需求.然而隨著企業(yè)信息化的不斷發(fā)展、業(yè)務(wù)的不斷增長(zhǎng)以及網(wǎng)絡(luò)的不穩(wěn)定性等因素的影響,導(dǎo)致單純應(yīng)用該架構(gòu)時(shí)往往不能保證客戶端處于離線狀態(tài)時(shí)系統(tǒng)正常工作,而基于Web Service[1]的系統(tǒng)架構(gòu)則可以很好地解決此問題.
基于Web Service的架構(gòu)可充分利用客戶端和Web技術(shù)的優(yōu)勢(shì),其最大優(yōu)點(diǎn)就是可以離線使用,使用戶不論何時(shí)何地都能正常地進(jìn)行工作.然而在具體實(shí)施時(shí)還有許多問題待解決,如客戶端在線和離線狀態(tài)的無縫切換時(shí)還存在著如何處理服務(wù)請(qǐng)求、如何緩存操作數(shù)據(jù)、Web Service服務(wù)器的響應(yīng)效率低下等問題[2].本文以Web Service架構(gòu)為基礎(chǔ),采用一種新的方案來提高Web Service服務(wù)器的響應(yīng)效率,從而較好地解決了離線應(yīng)用中的數(shù)據(jù)同步問題.
目前有兩種數(shù)據(jù)同步方案可供選擇:以數(shù)據(jù)為中心的方案和面向服務(wù)的方案.前者采用本地?cái)?shù)據(jù)庫(kù)和合并復(fù)制機(jī)制技術(shù),在服務(wù)器和客戶端之間相互復(fù)制操作數(shù)據(jù)來解決,其最大特點(diǎn)是要求在客戶端安裝本地?cái)?shù)據(jù)存儲(chǔ)區(qū);后者是通過服務(wù)請(qǐng)求與網(wǎng)絡(luò)上的服務(wù)進(jìn)行交互的,如果客戶端處于離線狀態(tài),它可以推遲服務(wù)請(qǐng)求,直到從新轉(zhuǎn)換為在線模式時(shí)再提交.
面向服務(wù)解決方案的最大特點(diǎn)是客戶端并沒有與它使用的服務(wù)緊密結(jié)合在一起,和服務(wù)是彼此獨(dú)立的,可以自由地與所需的任何服務(wù)進(jìn)行交互,所以面向服務(wù)的方案中客戶端可將重點(diǎn)放在服務(wù)請(qǐng)求本身上,而不是放在對(duì)本地保存的數(shù)據(jù)進(jìn)行直接更改上,當(dāng)客戶端在線時(shí)只需要提交服務(wù)請(qǐng)求就可完成數(shù)據(jù)操作任務(wù).另外,服務(wù)請(qǐng)求可能會(huì)導(dǎo)致客戶端或服務(wù)器上的狀態(tài)更改,但這些更改只是服務(wù)請(qǐng)求的副作用.
在面向服務(wù)方案的具體實(shí)施過程中還需要使用一種允許存儲(chǔ)服務(wù)請(qǐng)求詳細(xì)信息的基礎(chǔ)結(jié)構(gòu),該基礎(chǔ)結(jié)構(gòu)由下列4個(gè)主要元素組成:
(1)服務(wù)代理:服務(wù)代理提供服務(wù)的主要訪問點(diǎn).它管理客戶端與服務(wù)的所有交互,并封裝所有必要的邏輯以允許客戶端創(chuàng)建服務(wù)請(qǐng)求.
圖1 面向服務(wù)方案的組件
(2)服務(wù)請(qǐng)求:服務(wù)請(qǐng)求的所有詳細(xì)信息都封裝在一個(gè)服務(wù)請(qǐng)求對(duì)象中.然后,服務(wù)請(qǐng)求保留在服務(wù)請(qǐng)求隊(duì)列中,直到執(zhí)行程序組件可以對(duì)它們進(jìn)行處理.服務(wù)請(qǐng)求對(duì)象負(fù)責(zé)發(fā)出實(shí)際的服務(wù)請(qǐng)求.
(3)服務(wù)請(qǐng)求隊(duì)列:該隊(duì)列為服務(wù)請(qǐng)求對(duì)象提供持久的存儲(chǔ)區(qū).
(4)執(zhí)行程序:當(dāng)客戶端重新連接到網(wǎng)絡(luò)時(shí),執(zhí)行程序負(fù)責(zé)從隊(duì)列中提取服務(wù)請(qǐng)求并執(zhí)行它們.在服務(wù)請(qǐng)求完成后,執(zhí)行程序會(huì)通知服務(wù)代理,以便其可以通知客戶端.這4個(gè)元素之間的關(guān)系如圖1所示,從圖1中可以看出使用面向服務(wù)解決方案的組件中所必須包括的功能.
根據(jù)系統(tǒng)需求分析,EAMS包含了企業(yè)資產(chǎn)的前期管理、運(yùn)行、維修直到報(bào)廢等整個(gè)生命周期的管理,主要包括以下幾個(gè)功能模塊:
(1)設(shè)備管理:通過對(duì)設(shè)備臺(tái)帳、采購(gòu)、維修/檢修、成本分析等的信息化管理達(dá)到如下目標(biāo):促進(jìn)管理科學(xué)化;減少設(shè)備的故障率;降低設(shè)備維修成本;減少故障引起的經(jīng)濟(jì)損失;延長(zhǎng)設(shè)備壽命等.
(2)工單管理:是系統(tǒng)的主線,通過工單的提交、審批和執(zhí)行來幫助用戶管理、計(jì)劃和監(jiān)控工作進(jìn)程與資源調(diào)配情況.對(duì)于資產(chǎn)的安裝、調(diào)試、退役和變更、糾正性的維修和計(jì)劃性的維修以及預(yù)測(cè)性的維修都是通過工單來體現(xiàn)的.
(3)庫(kù)存管理:用于建立一套集成的庫(kù)存和物流管理平臺(tái),支持公司備件和材料等所有類型物料的庫(kù)存管理.庫(kù)存管理的主要目的在于庫(kù)存數(shù)量賬和金額賬的管理.
(4)采購(gòu)管理:用于控制采購(gòu)流程,管理采購(gòu)整個(gè)過程的各個(gè)方面,包括產(chǎn)生申請(qǐng)、批準(zhǔn)、供應(yīng)商選擇、采購(gòu)單發(fā)出、發(fā)票對(duì)照、收貨.采購(gòu)管理模塊使用戶能獲得和跟蹤實(shí)物資產(chǎn)維護(hù)工作需要的材料與服務(wù).
(5)項(xiàng)目管理:主要目標(biāo)是協(xié)調(diào)企業(yè)的各種資源,實(shí)現(xiàn)資金的合理利用、減少成本、增加效益.
圖2 總體架構(gòu)模型
此外,不同企業(yè)針對(duì)自身的實(shí)際情況可以增加或減少使用該EAMS的應(yīng)用模塊,達(dá)到既能節(jié)約成本,又能高效管理企業(yè)資產(chǎn)的需要.當(dāng)然,在進(jìn)行功能模塊設(shè)計(jì)時(shí),還應(yīng)考慮增加其它管理模塊,提供系統(tǒng)與其他管理事務(wù)的接口,增強(qiáng)系統(tǒng)的兼容性和可擴(kuò)展性.
基于XML與Web Service的數(shù)據(jù)同步策略是面向服務(wù)的,它使得客戶端可以與需要的服務(wù)進(jìn)行交互.而且,客戶端只需關(guān)注服務(wù)請(qǐng)求本身,而不需要對(duì)本地保存的數(shù)據(jù)進(jìn)行直接更改,其總體架構(gòu)如圖2所示.
在這里采用XML文件來緩存客戶端進(jìn)行的數(shù)據(jù)操作,我們可以將該XML文件看成是在離線工作時(shí)記錄客戶端每一步動(dòng)作的日志文件,在本策略中將它命名為xmllogger,并通過XSD(xml schema definition)來定義.
用XSD來定義xmllogger文件,而非直接在xmllogger文件中存放SQL語句,可減少客戶端系統(tǒng)的存儲(chǔ)開銷,并且能夠更好地利用XML文件的結(jié)構(gòu)性特點(diǎn),方便在Web服務(wù)器上的數(shù)據(jù)解析與命令執(zhí)行.
SQL命令經(jīng)由客戶端編碼后,通過HTTP協(xié)議由SOAP消息將xmllogger傳輸?shù)綐I(yè)務(wù)Web Service服務(wù)器,進(jìn)行相關(guān)的后續(xù)業(yè)務(wù)處理.
由于該架構(gòu)系統(tǒng)所具有的離線特性,決定了在進(jìn)行數(shù)據(jù)同步前,我們必須對(duì)其進(jìn)行相關(guān)的業(yè)務(wù)判斷,處理從斷開連接到聯(lián)機(jī)狀態(tài)時(shí)發(fā)生的并發(fā)性問題.例如,我們自定義的COMMANDTIME字段用來記錄操作的時(shí)間,通過它與數(shù)據(jù)庫(kù)已存信息進(jìn)行比較,對(duì)xmllogger文件的某些數(shù)據(jù)進(jìn)行必要的邏輯修改.另外必須完成服務(wù)隊(duì)列的監(jiān)控調(diào)用和數(shù)據(jù)抽取工作.本文通過支持流程監(jiān)控的WS-Proxy來完成服務(wù)隊(duì)列的監(jiān)控調(diào)用工作,而XML數(shù)據(jù)抽取則采用基于事件流的SAX來完成[4].WS-Proxy的詳細(xì)設(shè)計(jì)如圖3所示.
圖3 WS-Proxy的詳細(xì)設(shè)計(jì)
(1)本地服務(wù)目錄:用于維護(hù)外部Web Service和虛擬服務(wù)之間的映射,當(dāng)一個(gè)外部服務(wù)導(dǎo)入時(shí),該模塊將把其服務(wù)地址URI改成WS-Proxy的本地地址,同時(shí)將<原URI,本地URI>加入映射表中.此外,本地服務(wù)目錄還維護(hù)一個(gè)本地的UDDI組件,用于保存外部服務(wù)和生成的虛擬服務(wù)的WSDL描述.
(2)WSDL分析器:從本地服務(wù)目錄的UDDI組件中獲取業(yè)務(wù)流程用到的Web Service的WSDL描述,進(jìn)而獲取服務(wù)調(diào)用消息所包含的數(shù)據(jù)元素的詳細(xì)信息,這樣可以得到一張所有輸入輸出消息所包含的XML元素的列表以及它們?cè)谙⒅械木唧w位置(用XPath來描述).
(3)監(jiān)控計(jì)劃:負(fù)責(zé)維護(hù)一張監(jiān)控列表,指明了哪些服務(wù)和XML元素需要監(jiān)控.根據(jù)URI和操作名稱,WS-Proxy知道需要處理哪些服務(wù),而根據(jù)XML元素的名稱及其位置,WS-Proxy 可以知道需要抽取哪些元素的內(nèi)容以及該元素在消息中的位置.
(4)服務(wù)代理:是整個(gè)WS-Proxy的核心,所有的Web Service消息都由它來轉(zhuǎn)發(fā),同時(shí)它也負(fù)責(zé)對(duì)消息進(jìn)行監(jiān)控.每當(dāng)一個(gè)服務(wù)請(qǐng)求從流程發(fā)送到這里,服務(wù)代理首先檢查監(jiān)控列表,如果該服務(wù)的URI和操作名稱處在列表上,那么服務(wù)代理就將抽取與該操作關(guān)聯(lián)的XML元素內(nèi)容,并保存到監(jiān)控?cái)?shù)據(jù)的數(shù)據(jù)庫(kù)中.然后服務(wù)代理查找服務(wù)映射表,獲得對(duì)應(yīng)的外部Web Service的URI,并轉(zhuǎn)發(fā)服務(wù)請(qǐng)求至外部服務(wù)提供者.
在業(yè)務(wù)Web Service服務(wù)器上所進(jìn)行的業(yè)務(wù)處理步驟中非常重要的一步是對(duì)XML文檔的解析,本文使用JAXP(Java API for Processing)規(guī)范包裝的SAX來解析XML文檔,在文檔開始、元素開始、字符數(shù)據(jù)、元素結(jié)束和文檔結(jié)束5個(gè)事件分別對(duì)應(yīng)的回調(diào)方法中進(jìn)行編程處理.其總體架構(gòu)程序如下:
public class StoreXML extendsDefaultHandler {
private int nid; //當(dāng)前處理結(jié)點(diǎn)的 nid
private int pid; //當(dāng)前處理結(jié)點(diǎn)的 pid
private Stack
public static void store(String uri) {
SAXParserFactory spf =SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
sp.parse(uri, new StoreXML());}
//為節(jié)省篇幅,省略5個(gè)回調(diào)方法的具體實(shí)現(xiàn),而僅在下文中描述其需實(shí)現(xiàn)的功能
}
文檔開始方法(startDocument())完成3項(xiàng)功能:置當(dāng)前結(jié)點(diǎn)的nid=0,pid=-1;初始化棧stack將文檔結(jié)點(diǎn)的nid=0入棧;置下一個(gè)結(jié)點(diǎn)的nid=1.
元素開始方法(startElement(String uri, String name, AttributeList attrs))完成4項(xiàng)功能:取棧stack的棧頂數(shù)據(jù)作為當(dāng)前元素結(jié)點(diǎn)的pid;如果當(dāng)前元素有屬性,通過循環(huán)依次將每一對(duì)屬性名和屬性值插入到屬性表attrs,其nid就是當(dāng)前元素結(jié)點(diǎn)的nid;將當(dāng)前結(jié)點(diǎn)的nid入棧;使nid增1,以獲得下一個(gè)結(jié)點(diǎn)的先序遍歷序號(hào).
字符數(shù)據(jù)方法(characters(char[] ch, int start, int length))首先以字符串的形式獲取文本結(jié)點(diǎn)中的字符數(shù)據(jù),然后截?cái)嗥淝昂蟮目瞻鬃址?,若截?cái)嗪笤撟址疄榭眨瑒t忽略此文本結(jié)點(diǎn),否則將此文本結(jié)點(diǎn)的相關(guān)信息保存起來,并使nid增1.
元素結(jié)束方法(endElement(String uri, String name))和文檔結(jié)束方法(endDocument())的主要任務(wù)分別是將元素結(jié)點(diǎn)的nid和文檔結(jié)點(diǎn)的nid從棧頂彈出.
解析XML文檔后,業(yè)務(wù)Web service服務(wù)器便需要與數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行連接,執(zhí)行具體的操作,最后根據(jù)操作返回的結(jié)果執(zhí)行相關(guān)的處理.
若出現(xiàn)數(shù)據(jù)一致性等異常,則終止當(dāng)前操作,觸發(fā)并記錄異常,然后通過上述xmllogger文件中的CLIENTID(客戶端編號(hào))元素值通知相應(yīng)的客戶端;若操作成功,則刪除xmllogger緩存,減少資源占有率,達(dá)到優(yōu)化系統(tǒng)的目的.
本文提出的離線問題解決方案的最大優(yōu)點(diǎn)是在客戶端不需要安裝本地關(guān)系數(shù)據(jù)庫(kù),充分發(fā)揮了Web Service架構(gòu)在系統(tǒng)部署上的優(yōu)勢(shì),較好地解決了EAMS客戶端的離線應(yīng)用問題.另外,本方案將增加了WS-Proxy的擴(kuò)展型Web Service模型與一種高效的XML數(shù)據(jù)提取方法相結(jié)合,大大提高了Web Service服務(wù)器的響應(yīng)效率.同時(shí)利用不需要安裝本地關(guān)系數(shù)據(jù)庫(kù)的優(yōu)點(diǎn),可將該方案應(yīng)用于不同類型的客戶端,如PDA、手機(jī)等,具有較高的實(shí)際應(yīng)用價(jià)值.
參考文獻(xiàn)
[1] 景建篤,游曉黔. 安全Web Services體系結(jié)構(gòu)的研究[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2007,28(5):1 232-1 234.
[2] 李 磊,牛春雷,陳寧江,等. 一種高效的Web服務(wù)性能優(yōu)化策略[J]. 計(jì)算機(jī)研究與發(fā)展,2007,44(7):1 191-1 198.
[3] 任興田,黃小紅,馬 嚴(yán).基于Web Services服務(wù)管理系統(tǒng)的研究[J]. 計(jì)算機(jī)工程,2007,33(4):91-93.
[4] 柴曉路,梁宇奇. Web Services技術(shù)、架構(gòu)和應(yīng)用[M].北京:電子工業(yè)出版社,2003.
[5] 鄧 芳. XML文檔到數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)換研究[J]. 北京郵電大學(xué)學(xué)報(bào),2004,27(1):84-86.