承達(dá)瑜, 王衛(wèi), 吳非, 謝關(guān)寶
(中國(guó)石化石油工程技術(shù)研究院測(cè)錄井研究所, 北京 100029)
測(cè)井解釋軟件在測(cè)井資料儲(chǔ)層評(píng)價(jià)工作中具有圖形顯示速度快、用戶交互性強(qiáng)等特點(diǎn)[1]。測(cè)井解釋軟件網(wǎng)絡(luò)化、Web化、易擴(kuò)展的發(fā)展方向已經(jīng)成為共識(shí)。GeoFrame、eXpress、CIFLog測(cè)井軟件、Lead平臺(tái)以及Forward系列等軟件[2-5]其實(shí)現(xiàn)模式都以客戶端/服務(wù)器(Client/Server,C/S)為主。這些軟件的安裝、部署、升級(jí)和更新和維護(hù)需要專業(yè)人員完成。傳統(tǒng)的基于HTML頁(yè)面的Web應(yīng)用技術(shù)因其難以滿足測(cè)井圖件的快速顯示和快速交互的需要,并不適用于測(cè)井解釋軟件開(kāi)發(fā)。如何在Web環(huán)境下實(shí)現(xiàn)功能強(qiáng)大、靈活擴(kuò)展的測(cè)井解釋軟件是一大難題。
富互聯(lián)網(wǎng)應(yīng)用RIA(Rich Internet Applications)具有桌面應(yīng)用程序豐富的交互體驗(yàn)和傳統(tǒng)Web應(yīng)用無(wú)客戶端、部署靈活的優(yōu)點(diǎn)。本文采用RIA技術(shù),試圖構(gòu)建插件式的測(cè)井解釋軟件體系結(jié)構(gòu),設(shè)計(jì)面向RIA的插件框架、插件接口和通訊協(xié)議;采用JavaFX開(kāi)發(fā)一個(gè)原型系統(tǒng)驗(yàn)證其設(shè)計(jì)的正確性。
RIA綜合了B/S和C/S架構(gòu)的優(yōu)勢(shì),是一種全新的Web應(yīng)用模式,具有桌面應(yīng)用程序交互性強(qiáng)、反應(yīng)快的優(yōu)點(diǎn),又繼承了傳統(tǒng)Web應(yīng)用程序普遍應(yīng)用和靈活部署的特性[6]。RIA具有富客戶技術(shù)[7],“富”的概念是指包含豐富的數(shù)據(jù)模型和用戶界面。它充分利用了客戶端的計(jì)算處理能力,能提供響應(yīng)速度快和圖形豐富的用戶界面,平衡了客戶端和服務(wù)器端的負(fù)載。RIA技術(shù)為實(shí)現(xiàn)Web化的測(cè)井解釋軟件提供豐富完善的解決方案,也使得在Web環(huán)境下實(shí)現(xiàn)系統(tǒng)插件化成為可能。
主流的RIA實(shí)現(xiàn)技術(shù)有Flex、Silverlight以及JavaFX等。其中,Flex[8]是Adobe公司提供的RIA開(kāi)發(fā)和部署的平臺(tái),包括Flex Enterprise Services2、Flex Builder 2、Flex Framework等,主流版本是4.X[9];Silverlight[10]是微軟公司開(kāi)發(fā)的RIA應(yīng)用程序技術(shù),提供跨客戶平臺(tái)、跨瀏覽器的能力;JavaFX[11]是SUN公司利用Java運(yùn)行環(huán)境進(jìn)入RIA領(lǐng)域的開(kāi)發(fā)技術(shù),在JavaFX 2.0以后的版本完全兼容Java。這3種技術(shù)各有優(yōu)勢(shì),Flex最早推出RIA技術(shù),相對(duì)比較成熟;Silverlight的先天優(yōu)勢(shì)是有Windows平臺(tái)的支持;JavaFX與Java一脈相承,具有開(kāi)源的優(yōu)勢(shì),提供所有熟悉的語(yǔ)言功能(如泛型、注釋和多線程)、高性能的軟硬件加速圖形(Prism)和媒體引擎,支持二維和三維圖形、圖像、多媒體、動(dòng)畫(huà)等,并且兼容Java的Swing和AWT,能夠開(kāi)發(fā)具有豐富用戶體驗(yàn)的界面,實(shí)現(xiàn)復(fù)雜的圖形處理、顯示。服務(wù)器和客戶端平臺(tái)都采用Java技術(shù),降低了投資風(fēng)險(xiǎn),減少了業(yè)務(wù)解決方案的復(fù)雜性。選取JavaFX更適合作為測(cè)井解釋軟件的RIA開(kāi)發(fā)工具。
插件技術(shù)是一種提高軟件復(fù)用性和擴(kuò)展性的有效方法[12],基本思想就是在軟件的設(shè)計(jì)和研發(fā)過(guò)程中把待開(kāi)發(fā)的目標(biāo)軟件劃分為主體程序(或稱平臺(tái))和插件(按照預(yù)定接口實(shí)現(xiàn)的軟件功能構(gòu)件)2部分。在不需要重新編譯整個(gè)程序的前提下,可以在應(yīng)用程序開(kāi)發(fā)完畢后以補(bǔ)丁的形式對(duì)其修改,從而使得應(yīng)用程序可被定制、更靈活、更具有動(dòng)態(tài)性。
插件大致有3類[13]。①命令行插件,即應(yīng)用程序向用戶提供一些基本命令,用戶使用這些命令編寫(xiě)插件。該類插件一般是文本文件,開(kāi)發(fā)比較簡(jiǎn)單,但是功能單一。②用腳本語(yǔ)言實(shí)現(xiàn)插件,即用戶通過(guò)腳本語(yǔ)言編寫(xiě)插件。該類方法的優(yōu)點(diǎn)在于制作插件時(shí)不需要使用其它工具,軟件本身就可以實(shí)現(xiàn),普遍出現(xiàn)于各種辦公自動(dòng)化軟件中。③基于接口方式實(shí)現(xiàn)插件,即應(yīng)用程序規(guī)定插件調(diào)用接口,用戶依據(jù)接口規(guī)范編寫(xiě)插件。這類插件封裝性好,靈活性強(qiáng),能夠真正意義上實(shí)現(xiàn)“平臺(tái)+插件”的軟件結(jié)構(gòu),但是軟件設(shè)計(jì)的難度大,對(duì)開(kāi)發(fā)人員要求高。根據(jù)在線測(cè)井解釋軟件的具體需求,測(cè)井解釋系統(tǒng)采用了基于接口的插件實(shí)現(xiàn)方法。
根據(jù)RIA具有富客戶端、異步通信的特點(diǎn),系統(tǒng)設(shè)計(jì)的主要思想是將測(cè)井解釋涉及到的數(shù)據(jù)處理、算法、圖形顯示功能封裝成插件存儲(chǔ)在服務(wù)端,通過(guò)配置文件暴露插件接口,提供插件下載;在客戶端則依據(jù)插件原理設(shè)計(jì)測(cè)井解釋插件框架,根據(jù)用戶需求,動(dòng)態(tài)地從服務(wù)器下載和管理插件,完成各插件的注冊(cè)、加載和管理,實(shí)現(xiàn)按需服務(wù)、動(dòng)態(tài)擴(kuò)展。
遵循該設(shè)計(jì)思想,采用B/S設(shè)計(jì)模式,以多層架構(gòu)的方式進(jìn)行設(shè)計(jì)該架構(gòu),總體上分為客戶端表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層等3層架構(gòu)(見(jiàn)圖1)。與傳統(tǒng)的B/S模式不同的是,由于RIA具有豐富的數(shù)據(jù)模型、界面元素,使得瀏覽器客戶端具有C/S模式中客戶端的計(jì)算、展示能力,減輕了服務(wù)端的負(fù)載。業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層除了能夠在線處理提供客戶端的請(qǐng)求,還可以提供功能插件的下載,加強(qiáng)客戶端的處理能力,甚至可以實(shí)現(xiàn)客戶端離線工作功能。
該系統(tǒng)架構(gòu)中,表示層為用戶提供一個(gè)豐富的、具有高度用戶體驗(yàn)的可視化界面,以圖文一體化的方式進(jìn)行各種測(cè)井解釋業(yè)務(wù)的處理解釋。在本文的系統(tǒng)架構(gòu)中,表示層設(shè)計(jì)重點(diǎn)是插件式測(cè)井解釋軟件客戶端。整個(gè)表示層主要由基礎(chǔ)組件、插件框架和本地存儲(chǔ)等3部分組成,①基礎(chǔ)組件為用戶提供測(cè)井解釋所必須的曲線處理、交會(huì)圖、用戶交互等功能;②插件框架提供統(tǒng)一的插件注冊(cè)接口,同時(shí)管理每一個(gè)插件,負(fù)責(zé)在運(yùn)行時(shí)動(dòng)態(tài)加載可用插件、提供插件間的通信機(jī)制及卸載插件;③本地存儲(chǔ)保存了客戶端的配置信息、功能插件,提高客戶端的啟動(dòng)效率,同時(shí)也使得客戶端可以離線使用。業(yè)務(wù)邏輯層處于數(shù)據(jù)訪問(wèn)層與表示層中間,起到了承上啟下的作用,是系統(tǒng)架構(gòu)中的核心部分,主要負(fù)責(zé)實(shí)現(xiàn)數(shù)據(jù)預(yù)處理(如曲線拼接、環(huán)境校正)、數(shù)據(jù)分析、處理解釋以及成圖等測(cè)井解釋業(yè)務(wù)功能。數(shù)據(jù)層是系統(tǒng)應(yīng)用的基礎(chǔ),負(fù)責(zé)對(duì)測(cè)井?dāng)?shù)據(jù)的存取、維護(hù)和管理,提供測(cè)井?dāng)?shù)據(jù)的訪問(wèn)接口。
2.2.1 插件框架設(shè)計(jì)
插件框架支撐著整個(gè)插件式測(cè)井解釋軟件的結(jié)構(gòu),是測(cè)井解釋軟件客戶端核心的部分,負(fù)責(zé)管理和承載各類插件,根據(jù)插件配置生成交互界面,協(xié)調(diào)平臺(tái)、插件以及插件之間的互操作等。圖1為客戶端插件框架結(jié)構(gòu)圖,整個(gè)框架主要包含插件信息列表、插件管理器及通訊控制。插件信息表依據(jù)插件配置在運(yùn)行時(shí)維護(hù)所有注冊(cè)插件的基本信息,如插件名稱、版本和訪問(wèn)接口等,是插件運(yùn)行時(shí)進(jìn)行管理的基礎(chǔ)。插件管理器負(fù)責(zé)不同插件的全生命周期管理,實(shí)現(xiàn)插件的注冊(cè)、加載、調(diào)用、注銷(xiāo)、以及卸載等整個(gè)運(yùn)行過(guò)程的管理。通信控制負(fù)責(zé)平臺(tái)和插件、插件與插件之間的通信,將消息機(jī)制引入通信控制,定義消息類型,通過(guò)管理插件消息傳遞,將“插件-插件”的通信的關(guān)系變?yōu)椤霸床寮?消息總線-目的插件”關(guān)系,降低了插件之間的耦合度,使得插件的修改、替換和升級(jí)更加方便。
圖1 系統(tǒng)架構(gòu)
2.2.2 接口設(shè)計(jì)
接口實(shí)質(zhì)上是軟件模塊的調(diào)用規(guī)范。在插件式測(cè)井解釋系統(tǒng)中,接口在主程序中起到了橋梁作用,提供了插件的接入點(diǎn),使得插件功能可被主程序調(diào)用。一個(gè)描述插件標(biāo)識(shí)、插件狀態(tài)和行為等基本信息,提供插件共性操作的通用插件接口(IPlugin)是系統(tǒng)所必需的。IPlugin是所有插件必須實(shí)現(xiàn)的頂級(jí)接口。依據(jù)測(cè)井解釋業(yè)務(wù)和系統(tǒng)框架2部分,將插件劃分為解釋業(yè)務(wù)插件與框架插件2個(gè)大類,對(duì)應(yīng)于這兩類插件,可將測(cè)井解釋系統(tǒng)的接口集合劃分為框架接口和測(cè)井解釋業(yè)務(wù)接口。
為了便于開(kāi)發(fā),對(duì)于圖形顯示模塊采用圖元化設(shè)計(jì),即通過(guò)圖元的組合、拼裝構(gòu)建多樣的圖形。相對(duì)于圖元設(shè)計(jì),圖形繪制接口提供測(cè)井基本圖元和復(fù)合圖元接口。同時(shí),依據(jù)解釋習(xí)慣及輸入、輸出數(shù)據(jù)的特性,可將算法接口細(xì)分為預(yù)處理接口、常規(guī)測(cè)井接口、工程測(cè)井接口、生產(chǎn)測(cè)井接口及特殊測(cè)井接口等算法接口。具體的接口關(guān)系見(jiàn)圖2;每類接口含義見(jiàn)表1。
2.2.3 通信機(jī)制
實(shí)現(xiàn)測(cè)井解釋平臺(tái)和插件、插件與插件之間的通信、調(diào)用是插件式測(cè)井解釋系統(tǒng)主要的關(guān)鍵技術(shù),必須建立一套既能保證各插件之間的通信又可維持其獨(dú)立性的控制機(jī)制。借鑒Java的委派事件模型[14](Delegation Event Model,DEM)構(gòu)建測(cè)井解釋插件通信機(jī)制,以觀察者(又稱為發(fā)布/訂閱)模式處理插件間各類事件的激發(fā)與響應(yīng)。插件通信機(jī)制包含事件源(插件事件處理類)、事件監(jiān)聽(tīng)對(duì)象和事件對(duì)象(具體事件對(duì)象)三要素(見(jiàn)圖3)。其中,事件源提供各類測(cè)井解釋插件事件處理功能,事件監(jiān)聽(tīng)對(duì)象實(shí)現(xiàn)事件的添加、卸載和執(zhí)行,事件對(duì)象傳遞與事件相關(guān)的信息,觸發(fā)某個(gè)具體插件的調(diào)用。
圖2 測(cè)井解釋插件接口集
接口說(shuō)明IPlugin頂層接口,類似于基類,所有插件必須繼承該接口,內(nèi)含插件標(biāo)識(shí)、版本信息、插件類型、插件狀態(tài)、行為以及插件提供者信息等描述信息。IToolCommand系統(tǒng)級(jí)工具條,非插件內(nèi)部的工具條。IMenuCommand系統(tǒng)級(jí)菜單類。IBasicGRA提供測(cè)井曲線、陣列、道信息、線段、圖頭、文本注釋等基本圖形繪制接口。ICompositeGRA提供地質(zhì)類、油藏類、工程類、輔助及解釋成果等圖形繪制接口。IConventional提供泥質(zhì)砂分析、復(fù)雜巖性分析等常規(guī)測(cè)井算法的封裝。IPreconditioning提供深度校正、平滑濾波、環(huán)境校正等數(shù)據(jù)預(yù)處理算法。IProuduction提供產(chǎn)液、產(chǎn)氣剖面處理、中子壽命處理、RMT處理、GR-GR測(cè)井處理、固井質(zhì)量評(píng)價(jià)、氧活化測(cè)井處理及電磁探傷等算法接口。IEngineering包括固井質(zhì)量評(píng)價(jià)、套損套變檢測(cè)、油藏工程措施效果評(píng)價(jià)、地質(zhì)工程參數(shù)計(jì)算等算法接口。ISpecial提供多臂(4、6、8臂)地層傾角處理、介電、能譜、碳氧比、全波列、FMT/RFT和井斜等處理算法接口。IDataAccess提供不同格式測(cè)井?dāng)?shù)據(jù)的讀寫(xiě),如測(cè)井WIS文件、oracle數(shù)據(jù)庫(kù)。
圖3 消息通信模型
使用該通訊模型的前置條件是初始化插件事件監(jiān)聽(tīng)器,即將各類插件處理事件添加到事件監(jiān)聽(tīng)器中,構(gòu)建監(jiān)聽(tīng)事件列表。在具體進(jìn)行通信時(shí),事件對(duì)象將外部動(dòng)作需求以消息的方式傳遞到插件事件監(jiān)聽(tīng)器;通過(guò)解析需求消息,事件監(jiān)聽(tīng)器激活具體的事件處理,響應(yīng)外部的動(dòng)作,實(shí)現(xiàn)平臺(tái)、各類插件之間的通信。通過(guò)這種設(shè)計(jì)有效地實(shí)現(xiàn)各應(yīng)用模塊之間的實(shí)時(shí)響應(yīng)與協(xié)同,模塊之間完全解耦,保證了平臺(tái)良好的獨(dú)立性和擴(kuò)展性,便于應(yīng)用模塊的并行開(kāi)發(fā)。
2.2.4 插件運(yùn)行方式
程序啟動(dòng),初始化內(nèi)核與插件管理,主程序通過(guò)解釋相應(yīng)的配置文件向插件管理器插件加載請(qǐng)求,插件管理器根據(jù)配置信息,查找相關(guān)插件,檢查插件的合法性,完成插件的注冊(cè)、加載。在運(yùn)行過(guò)程中,當(dāng)有事件發(fā)送時(shí),插件管理器解析事件類型,調(diào)用相應(yīng)的插件進(jìn)行處理。程序結(jié)束時(shí),插件管理器把當(dāng)前所用插件配置寫(xiě)回配置文件,注銷(xiāo)插件。其流程見(jiàn)圖4。
圖4 插件運(yùn)行時(shí)序圖
Web表示層的實(shí)現(xiàn)利用JavaFX主要開(kāi)發(fā)3個(gè)方面內(nèi)容,①作為測(cè)井解釋的可視化交互接口(即客戶端基本組件的開(kāi)發(fā)),包括各種測(cè)井曲線圖、圖形上進(jìn)行各種操作、測(cè)井?dāng)?shù)據(jù)表和數(shù)據(jù)錄入界面、直方圖、散點(diǎn)圖、交會(huì)圖;②測(cè)井?dāng)?shù)據(jù)的呈現(xiàn)、與服務(wù)器的數(shù)據(jù)交換,完成相關(guān)功能。③實(shí)現(xiàn)插件管理。這樣,大部分的測(cè)井解釋的操作和功能都在客戶端完成,減輕了服務(wù)器端的壓力。
在系統(tǒng)中,插件采用“程序集+插件說(shuō)明”的結(jié)構(gòu)實(shí)現(xiàn),除了基本組件以外的算法、圖形繪制等,其他功能模塊都依據(jù)測(cè)井解釋插件接口規(guī)范以JAR文件包的方式進(jìn)行封裝。在每一個(gè)JAR文件中包含META-INF目錄,其中必包含有一個(gè)MANIFEST.MF,這個(gè)文件描述了該JAR文件的很多信息,并支持定義屬性。MANIFEST.MF是專為提高效率設(shè)計(jì)的,與XML一樣具有可讀性,比XML讀取效率更高。通過(guò)將插件標(biāo)識(shí)、插件運(yùn)行依賴項(xiàng)、插件制作背景等信息記錄到MANIFEST.MF文件實(shí)現(xiàn)對(duì)插件的說(shuō)明,便于插件注冊(cè)、搜索和管理。
插件管理在系統(tǒng)中以PluginManager類實(shí)現(xiàn),包含loadPlugin()、unloadPlugin()、stopPlugin()等函數(shù),實(shí)現(xiàn)與所有插件相關(guān)的操作。JavaFX全面兼容Java語(yǔ)言,在具體實(shí)現(xiàn)時(shí)采用了Java反射機(jī)制[15]與消息傳遞的結(jié)合,增強(qiáng)了插件管理的靈活性、動(dòng)態(tài)性。以loadPlugin()操作為例,利用URLClassloader和Java反射調(diào)用被加載插件的Plugin類中的init化方法。這樣加載的插件可通過(guò)MsgProxy.class與框架通信,還可在自身的功能實(shí)現(xiàn)中調(diào)用MsgProxy.class提供的方法。
(1) 在分析現(xiàn)有測(cè)井解釋軟件優(yōu)缺點(diǎn)的基礎(chǔ)上,結(jié)合RIA和插件技術(shù),以B/S模式設(shè)計(jì)插件式測(cè)井解釋軟件,滿足用戶在線測(cè)井解釋分析的需求。
(2) 介紹了RIA和插件技術(shù)特點(diǎn),選擇以JavaFX作為RIA的開(kāi)發(fā)工具和基于接口的插件開(kāi)發(fā)方式。以分層設(shè)計(jì)的思想,構(gòu)建了包含表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層的系統(tǒng)架構(gòu),分別設(shè)計(jì)插件框架、測(cè)井解釋插件接口集合和插件間的通信模型。
(3) 這種松散耦合的架構(gòu)方式降低了軟件設(shè)計(jì)開(kāi)發(fā)的難度,提高了開(kāi)發(fā)效率,也保障了系統(tǒng)的靈活高效穩(wěn)定,為復(fù)雜多變的測(cè)井解釋?xiě)?yīng)用程序開(kāi)發(fā)提供了良好的支持,是未來(lái)專業(yè)測(cè)井解釋系統(tǒng)設(shè)計(jì)開(kāi)發(fā)的重要架構(gòu)方式之一。
(4) 由于要下載插件,系統(tǒng)首次初始化時(shí)效率不高,這也是下一步研究的有待解決的問(wèn)題。
參考文獻(xiàn):
[1] 原宏壯, 陸大衛(wèi), 張辛耘. 測(cè)井技術(shù)新進(jìn)展綜述 [J], 地球物理學(xué)進(jìn)展, 2005, 20(3): 786-795.
[2] 杜飚. GeoFrame軟件在測(cè)井評(píng)價(jià)中的應(yīng)用 [J]. 江漢石油科技, 2006, 16(1): 15-17.
[3] 余春昊, 李長(zhǎng)文. LEAD測(cè)井綜合應(yīng)用平臺(tái)開(kāi)發(fā)與應(yīng)用 [J]. 測(cè)井技術(shù), 2005, 29(5): 396-398.
[4] 姜濤. 新一代測(cè)井地質(zhì)綜合應(yīng)用網(wǎng)絡(luò)平臺(tái)FORWARD. NET 2.0 [J]. 石油工業(yè)計(jì)算機(jī)應(yīng)用, 2005, 13(3): 9-11.
[5] 李寧, 王才志, 劉英明. 基于Java-NetBeans的第三代測(cè)井軟件CIFLog [J]. 石油學(xué)報(bào), 2013, 34(1): 192-200.
[6] 希賽網(wǎng). RIA技術(shù)專題[EB/OL]. http: ∥tech.csai.cn/zt/RIA/index.htm,2010.
[7] Preciado J C, Linaje M, Sanchez F, et al. Necessity of Methodologies to Model Rich Internet Applications [C]∥Proceedings of the Seventh IEEE International Symposium on Web Site Evolution, 2005: 7-13.
[8] 汪林林, 胡德華, 王佐成, 等. 基于Flex的RIA WebGIS研究與實(shí)現(xiàn) [J]. 計(jì)算機(jī)應(yīng)用, 2008, 28(12): 3257-3260.
[9] Michael Labriola, Jeff Tapper, Matthew Boles. Flex 4權(quán)威指南 [M]. 北京: 人民郵電出版社, 2012: 52-58.
[10] 丁士峰. 精通Silverlight: RIA開(kāi)發(fā)技術(shù)詳解 [M]. 北京: 人民郵電出版社, 2008: 48-55.
[11] DiMarzio J F. 新手學(xué)JavaFX [M]. 北京: 清華大學(xué)出版社, 2013: 12-15.
[12] 李俊娥, 周洞汝. “平臺(tái)/插件”軟件體系結(jié)構(gòu)風(fēng)格 [J]. 小型微型計(jì)算機(jī)系統(tǒng), 2007, 28(5): 876-881.
[13] 陳云云, 馬捷中, 蔣澤軍. 基于插件的組態(tài)軟件設(shè)計(jì)與實(shí)現(xiàn) [J]. 計(jì)算機(jī)測(cè)量與控制, 2013, 21(2): 436-438.
[14] 宋淼, 袁兆山, 陳剛, 等. Java事件處理機(jī)制中設(shè)計(jì)模式的分析 [J]. 合肥工業(yè)大學(xué)學(xué)報(bào): 自然科學(xué)版, 2004, 27(11): 1382-1386.
[15] 趙宏利, 李秀冰, 李大林. 基于反射機(jī)制的插件系統(tǒng)軟件設(shè)計(jì) [J]. 計(jì)算機(jī)工程與設(shè)計(jì), 2010, 31(2): 348-355.