◎ 浙江大學(xué)控制科學(xué)與工程學(xué)系 田 徑 張光新 侯迪波 黃平捷 周澤魁
近年來,突發(fā)性水質(zhì)污染事故頻頻發(fā)生,不斷地惡化著我國的水環(huán)境,威脅著人民的用水安全,給社會經(jīng)濟(jì)帶來了巨大的損失,使得水資源緊張的矛盾愈加突出。如何在面對復(fù)雜多變的水質(zhì)環(huán)境時,根據(jù)實際的情況相應(yīng)及時地進(jìn)行預(yù)警政策調(diào)整,靈活地應(yīng)對各種突發(fā)性污染事故,建立起健全的水質(zhì)信息預(yù)警系統(tǒng),有效地處理水質(zhì)污染事故,為進(jìn)一步的應(yīng)對水質(zhì)污染事故提供相關(guān)的決策支持,保障人民用水安全,最大限度地減少各方面的損失變得尤為重要。研究了基于java動態(tài)編譯技術(shù)的水質(zhì)預(yù)警信息系統(tǒng)構(gòu)建技術(shù),對預(yù)警系統(tǒng)水質(zhì)信息數(shù)據(jù)進(jìn)行實時錄入,對水質(zhì)預(yù)警算法及預(yù)警模型邊界條件進(jìn)行實時編寫,動態(tài)編譯,以滿足復(fù)雜多變的水質(zhì)環(huán)境預(yù)警信息系統(tǒng)功能要求。
基于動態(tài)編譯的水質(zhì)預(yù)警信息系統(tǒng)基于Struts 2技術(shù)建立整體架構(gòu),由模型層(Model),視圖層(View)和控制層(Control)構(gòu)成完整的體系,層與層之間構(gòu)成自上而下的依賴關(guān)系,實現(xiàn)了視圖,數(shù)據(jù)與代碼的分離,動態(tài)代碼編譯服務(wù)代碼與具體數(shù)據(jù)的分離,同時各層之間留有接口,為構(gòu)建功能完善的預(yù)警系統(tǒng)做好準(zhǔn)備。實現(xiàn)了預(yù)警系統(tǒng)水質(zhì)信息數(shù)據(jù)的動態(tài)錄入、水質(zhì)預(yù)警算法及預(yù)警模型邊界條件的動態(tài)編寫與動態(tài)編譯等功能。系統(tǒng)的信息架構(gòu)見圖1所示。
視圖層采用Jquery技術(shù)用來實現(xiàn)與用戶的交互功能,展示用戶感興趣的數(shù)據(jù),并且采用Json技術(shù)實現(xiàn)用戶水質(zhì)信息數(shù)據(jù)的動態(tài)錄入,水質(zhì)預(yù)警算法代碼以及預(yù)警模型的邊界條件代碼的動態(tài)編寫錄入以及水質(zhì)預(yù)警算法的動態(tài)管理包括查詢相關(guān)算法,刪除相關(guān)算法,新建相關(guān)算法,邊界條件編譯和手自動運(yùn)行方式選擇等。界面具體見圖2,圖3:
針對多種多樣的水質(zhì)環(huán)境對算法和邊界條件進(jìn)行動態(tài)編寫是很需要的。通過實時輸入算法,輸入邊界條件可以實現(xiàn)對不同的污染事故進(jìn)行實時預(yù)警,即根據(jù)污染事故發(fā)生不同的水體類型、污染源類型、污染物性質(zhì)等編寫不同的水質(zhì)預(yù)警算法。
在整個系統(tǒng)中,控制層將針對視圖層提交的服務(wù)請求,進(jìn)行服務(wù)資源的管理,接受用戶動態(tài)輸入的水質(zhì)預(yù)警需求服務(wù)算法代碼及預(yù)警算法的邊界條件服務(wù)代碼,經(jīng)過代碼編譯預(yù)處理優(yōu)化后,調(diào)用java動態(tài)編譯技術(shù)進(jìn)行編譯并且運(yùn)行,將預(yù)警結(jié)果返回給用戶。
2.3.1 控制層編譯預(yù)處理
由于系統(tǒng)進(jìn)行動態(tài)編譯處理具有很大的風(fēng)險性,惡性代碼會給系統(tǒng)帶來不穩(wěn)定性,因此編譯預(yù)處理過程尤為重要。同時,編譯預(yù)處理過程對執(zhí)行服務(wù)所需要的地址空間、存儲資源、服務(wù)時間、服務(wù)運(yùn)行注冊以及服務(wù)注銷等系統(tǒng)資源進(jìn)行管理。具體過程如圖4所示:
圖1 水質(zhì)預(yù)警信息系統(tǒng)架構(gòu)
圖2 視圖層示例-算法的相關(guān)管理
圖3 視圖層示例-動態(tài)編寫算法
圖4 編譯預(yù)處理過程
當(dāng)用戶輸入水質(zhì)預(yù)警服務(wù)代碼并且提交請求后,控制層檢查請求服務(wù)資源是否充足。如不足,則掛起請求,在下一周期再次查詢;如果服務(wù)資源滿足,則對請求進(jìn)行響應(yīng),進(jìn)行詞法分析與語法分析,解析出相關(guān)服務(wù)代碼的關(guān)鍵字后,語法分析輸入代碼語法是否出錯。如出錯,就調(diào)用相關(guān)視圖信息通知用戶。否則,將代碼轉(zhuǎn)換后進(jìn)行動態(tài)編譯過程。
2.3.2 控制層動態(tài)編譯運(yùn)行水質(zhì)預(yù)警算法
從JDK1.6開始,Java就增加了動態(tài)編譯特性,使控制層可以在程序運(yùn)行時調(diào)用Compiler API實現(xiàn)水質(zhì)預(yù)警服務(wù)算法的動態(tài)編譯。控制層在經(jīng)歷編譯預(yù)處理過程后,將生成的有效地的水質(zhì)預(yù)警算法按照用戶輸入的算法名稱存儲為.java文件。然后就利用Compiler API進(jìn)行動態(tài)編譯,生成.class文件并且存儲,將相關(guān)的水質(zhì)預(yù)警算法添加進(jìn)算法數(shù)據(jù)庫以便進(jìn)行管理。
完成動態(tài)編譯后,待預(yù)警算法運(yùn)行條件成熟時,將算法注冊,確定算法開始運(yùn)行時刻,運(yùn)行時間,動態(tài)地控制服務(wù)的開啟與關(guān)閉,從而可避免因資源不足而產(chǎn)生的異常服務(wù)。算法的動態(tài)編譯執(zhí)行可以實現(xiàn)實時地對檢測到的水質(zhì)信息數(shù)據(jù),如BOD,氨氮,重金屬離子以及相關(guān)的葉綠素等的預(yù)警處理。(如圖5)
模型層采用JavaBean技術(shù),主要實現(xiàn)與數(shù)據(jù)庫的交互功能,將用戶輸入代碼與具體數(shù)據(jù)相分離。同時將數(shù)據(jù)庫操作算法封裝在JavaBean中,節(jié)省了用戶的編程時間,同時加入了相關(guān)的異常捕捉處理,保證了系統(tǒng)的安全性,穩(wěn)定性。
系統(tǒng)包括以下幾個數(shù)據(jù)庫:
1)水質(zhì)數(shù)據(jù)庫。記錄日常水質(zhì)監(jiān)測常規(guī)和非常規(guī)參數(shù)的數(shù)據(jù),便于預(yù)警算法調(diào)用數(shù)據(jù)進(jìn)行預(yù)警處理。記錄包括監(jiān)測指標(biāo)、監(jiān)測結(jié)果、監(jiān)測日期、監(jiān)測單位、標(biāo)準(zhǔn)級別等信息。
2)預(yù)警算法數(shù)據(jù)庫。記錄動態(tài)編譯的預(yù)警算法,算法的運(yùn)行狀態(tài),算法編制人員,算法預(yù)警類型,運(yùn)行條件以及相關(guān)的運(yùn)行時間等信息。
3)算法運(yùn)算結(jié)果庫。記錄算法運(yùn)行的結(jié)果類型,具體結(jié)果以及結(jié)果運(yùn)算時間等信息。
面對復(fù)雜而多變的水質(zhì)環(huán)境,積極靈活的應(yīng)對突發(fā)性水污染事故,需要建立科學(xué)有效的預(yù)警處理系統(tǒng)。研究了基于java動態(tài)編譯技術(shù)的水質(zhì)預(yù)警信息系統(tǒng)構(gòu)建方法。對水質(zhì)信息數(shù)據(jù)進(jìn)行實時地錄入,在系統(tǒng)中根據(jù)實際水質(zhì)情況實時地編寫水質(zhì)預(yù)警算法,輸入預(yù)警模型的邊界條件,并進(jìn)行動態(tài)編譯,以便相關(guān)人員根據(jù)實際險情動態(tài)調(diào)整應(yīng)對決策。但是,為保證系統(tǒng)的穩(wěn)定性,在一定程度上限制了動態(tài)編譯技術(shù)的靈活使用,為了使系統(tǒng)能夠更加完善高效,需進(jìn)一步研究動態(tài)編譯限制問題。