陳江浩,余衛(wèi)東,雷曉陽,彭慧琴,方璐,張培軍
(中國石油集團測井有限公司,陜西 西安710077)
EILog[1]測井成套裝備已經(jīng)在國內(nèi)外30多個地區(qū)和油田投入生產(chǎn)應(yīng)用,井下測井儀器也開發(fā)出適用于常規(guī)裸眼井測井、套管井測井、非常規(guī)測井、過鉆具測井等多個系列;地面系統(tǒng)也逐步向網(wǎng)絡(luò)化、智能化發(fā)展。這些都對ACME[2]測井采集軟件提出更高的要求。①可擴展性。軟件用戶的多樣化,儀器系列的增加,地面系統(tǒng)新技術(shù)應(yīng)用對測井采集軟件的可擴展性提出更高要求,主要集中在儀器組件庫的擴展、主控模塊的擴展、處理方法的擴展、繪圖對象的擴展。②可維護性。軟件日益復(fù)雜,要求從軟件設(shè)計角度進一步降低軟件的維護成本,提高維護效率和質(zhì)量,方便軟件推廣應(yīng)用。
本文在深入分析 OSGi[3](Open Service Gateway Initiative)框架的基礎(chǔ)上,提出了一種基于C++的跨平臺Q-OSGi框架實現(xiàn),重點解決服務(wù)層、生命周期層、事件服務(wù)、擴展點等關(guān)鍵技術(shù)。將該框架應(yīng)用在測井采集實時監(jiān)控軟件中,特別是對集成界面、可視化系統(tǒng)、數(shù)據(jù)層進行了詳細設(shè)計。
OSGi服務(wù)平臺規(guī)范是OSGi聯(lián)盟提出的一個松耦合、面向服務(wù)的應(yīng)用程序開發(fā)框架[4]。它提供了系統(tǒng)動態(tài)擴充、修改系統(tǒng)功能和改變系統(tǒng)行為的支持,也提供了規(guī)范化的模塊組件以及統(tǒng)一的開發(fā)方式。
OSGi框架的優(yōu)勢主要集中3個方面:可擴展性、軟件復(fù)雜度和可維護性。利用OSGi框架本身提供的動態(tài)擴展支持,通過對整個系統(tǒng)進行模塊化拆分,降低了模塊實施的復(fù)雜度。通過良好的模塊化組織和版本管理,通過局部更新來減少對整個軟件系統(tǒng)的影響,進一步降低了維護成本。
OSGi框架是基于Java語言特性而定制的。由于Java語言采用虛擬機形式運行,對于測井實時采集軟件其運行效率不能滿足要求,而且測井采集軟件已有代碼都是基于C++開發(fā)的,必須充分繼承這部分資源,降低開發(fā)成本。
Qt是一個跨平臺C++圖形用戶界面應(yīng)用框架。Qt完全面對對象,容易擴展,并且允許真正地組件編程。它具有優(yōu)良的跨平臺特性,Qt支持的操作系統(tǒng)有 Windows 95/98、Windows NT、Linux、Solaris、SunOS、HP-UX等。
鑒于Qt的跨平臺性和其本質(zhì)是C++語言的特點,跨平臺測井軟件的核心框架Q-OSGi利用Qt庫,依據(jù)OSGi規(guī)范標準裁剪了與java相關(guān)的內(nèi)容,實現(xiàn)了一個同時滿足測井軟件的需求又實現(xiàn)了OSGi平臺規(guī)范的輕量級插件框架。
基于這個框架,通過對集成界面、可視化界面和數(shù)據(jù)層的實現(xiàn),最終充分利用OSGi平臺的優(yōu)勢框架理念,并能夠減少OSGi的不足和繼承原有代碼,降低開發(fā)成本。該框架系統(tǒng)結(jié)構(gòu)見圖1。
2.1.1 Q-OSGi框架的服務(wù)層(Service Layer)
圖1 Q-OSGi框架系統(tǒng)結(jié)構(gòu)圖
插件(Plugin)對應(yīng)于OSGi中的Bundle,構(gòu)成了Q-OSGi的基礎(chǔ)單元。它建立在系統(tǒng)的相互協(xié)作的可用服務(wù)之上,這些服務(wù)共享一個服務(wù)注冊中心。服務(wù)對象是屬于插件的,而且必須在插件之內(nèi)運行。插件必須將服務(wù)對象注冊到框架服務(wù)注冊中心,這樣其他插件才可以查詢到該插件提供的服務(wù)。提供服務(wù)的插件和使用服務(wù)的插件之間的依賴關(guān)系由框架管理。當停止一個插件后,該插件在框架中注冊的服務(wù)必須要自動取消注冊。
2.1.2 Q-OSGi框架的生命周期層(Life Cycle Layer)
一個插件的生命周期分為6個狀態(tài),分別是UNINSTALLED(未安裝)、INSTALLED(安裝)、RESOLVED(解決的)、STARTING(啟動)、STOPPING(停止)、ACTIVE(激活)。插件的狀態(tài)變化見圖2。由圖2可知,插件安裝后,首先對插件信息進行解析,檢測類依賴是否正確,成功后狀態(tài)變?yōu)镽ESOLVED??蚣軉硬寮寮趩悠陂g,根據(jù)相關(guān)協(xié)議檢測,如果啟動成功,插件狀態(tài)變成ACTIVE(激活),這時插件可以對外提供服務(wù)。
圖2 Q-OSGi框架插件狀態(tài)圖
2.1.3 Q-OSGi事件服務(wù)規(guī)范
在Q-OSGi框架中,為滿足插件之間的通訊要求,采用發(fā)布者/訂閱者模式實現(xiàn)事件服務(wù)機制。按照事件發(fā)送者的不同,事件定義分為2類。①框架發(fā)送的標準事件,主要包括普通框架事件、生命周期中的插件狀態(tài)改變。②任何插件都可以根據(jù)自身需要,發(fā)送基于主題(Topic)的事件。
圖3描述的時間服務(wù)處理流程主要面對2個對象:事件發(fā)布者和事件訂閱者。事件發(fā)布者使用postEvent和sendEvent發(fā)送事件到事件服務(wù),事件服務(wù)再通過handleEvent接口將事件發(fā)送給事件訂閱者。事件發(fā)布者使用事件服務(wù)發(fā)送基于主題(Topic)的事件,任何對某一主題感興趣的事件訂閱者都會收到該事件,并且做出相應(yīng)的反應(yīng)。
圖3 Q-OSGi事件服務(wù)處理流程
2.1.4 Q-OSGi擴展點設(shè)計
為了增強系統(tǒng)的靈活性和擴展性,系統(tǒng)擴展了OSGi的規(guī)范設(shè)計,實現(xiàn)了擴展點機制。擴展插件的結(jié)構(gòu)見圖4。插件本身可以同時具有擴展點和擴展實現(xiàn),各個插件可以定義自身的擴展點供其他插件實現(xiàn),同時也可以實現(xiàn)其他插件的擴展點。插件本身需要實現(xiàn)系統(tǒng)中已有的擴展點才能插入到系統(tǒng)和已有的插件集成。插件本身可以是新的擴展點,在此基礎(chǔ)上可以讓其它插件擴展出新的功能。在單個插件的基礎(chǔ)上,插件之間不斷進行擴展,形成插件網(wǎng)絡(luò),最終組合成整個系統(tǒng)。
圖4 擴展點結(jié)構(gòu)圖
為了充分利用Q-OSGi框架的靈活性和可擴展性,增強系統(tǒng)的穩(wěn)定性,減少維護成本,測井軟件的設(shè)計使用微內(nèi)核架構(gòu)。微內(nèi)核架構(gòu)將系統(tǒng)服務(wù)的實現(xiàn)和系統(tǒng)基本操作規(guī)則分離開來,系統(tǒng)核心只包含必須的部分。通過這種設(shè)計大大簡化了移植和升級維護的困難,同時由于內(nèi)核的代碼不多,也容易進行除錯,增加系統(tǒng)的穩(wěn)定性。一個服務(wù)組件的失效并不會導(dǎo)致整個系統(tǒng)的崩潰,內(nèi)核需要做的僅僅是重新啟動這個組件,而不必影響其他部分。
微內(nèi)核負責搜索、加載、啟動/關(guān)閉插件。微內(nèi)核啟動后,會首先搜索和加載用戶許可校驗插件,用以確定用戶許可使用的插件。加載和啟動集成界面插件,最終啟動整個系統(tǒng)的各個模塊。由于插件系統(tǒng)的特性,插件還可以動態(tài)啟動,實現(xiàn)懶加載模式。
整個測井軟件按照測井業(yè)務(wù)功能層次劃分,主要由集成界面、可視化系統(tǒng)、數(shù)據(jù)層組成(見圖5)。
圖5 系統(tǒng)總體結(jié)構(gòu)圖
2.2.1 集成界面
集成界面設(shè)計系統(tǒng)的集成界面由界面顯示插件和其他可視化系統(tǒng)插件集成而組成的。集成界面主插件負責收集、管理接口數(shù)據(jù),向Q-OSGi框架中注冊服務(wù),并在交互界面上顯示。插件可以根據(jù)需要向系統(tǒng)界面中加入子菜單或操作項,也可以根據(jù)需要在菜單欄中添加新的菜單項。由于采用靈活的插件機制,測井軟件實現(xiàn)了2套集成界面插件,一套是基于觸摸屏的平板版用戶交互界面,另一套是基于桌面系統(tǒng)的交互界面。通過插件配置,可以方便地實現(xiàn)一個運行程序、兩種用戶體驗。
2.2.2 可視化系統(tǒng)
可視化系統(tǒng)主要有測井視圖、組合視圖、圖表視圖等3個視圖子系統(tǒng)。組合視圖和圖表視圖的結(jié)構(gòu)比較簡單,通過繼承QGraphicsView[4]類實現(xiàn)視圖的繪制。測井視圖子系統(tǒng)需要考慮多種情況和多種類型的對象的擴展和管理,結(jié)構(gòu)較為復(fù)雜。測井視圖的類圖見圖6。
測井視圖中視圖(View)接口為VLoggingView,場景(Scence)接口為 VLoggingScence,元素(Item)實現(xiàn)為TrackItem類。TrackItem包括了Track-BodyItem和 TrackHeadItem。TrackContentItem是道內(nèi)包含元素的實現(xiàn),它繼承自IDrawExt,由ITrackDrawExt組成。在測井系統(tǒng)的設(shè)計中,設(shè)計了2個接口類IDrawExt,TrackDrawExt,分別是曲線對象和道對象的擴展接口。由圖6可知,繼承IDrawExt,實現(xiàn)了普通曲線對象Curve,波列曲線WAVE,變密度曲線VDL。繼承ITrackDrawExt,實現(xiàn)了索引道,線性道,對數(shù)道。在系統(tǒng)擴展時,僅需要實現(xiàn)這2個接口,就可以擴展不同類型的道對象和曲線對象,方便了用戶的擴展。
圖6 測井視圖類圖
2.2.3 數(shù)據(jù)層
實時測井數(shù)據(jù)文件物理結(jié)構(gòu)采用的是被廣泛應(yīng)用在地球物理系統(tǒng)中的HDF5[6]數(shù)據(jù)格式,其采用類似文件系統(tǒng)的方式對數(shù)據(jù)進行結(jié)構(gòu)化存儲,這種設(shè)計極大地提升數(shù)據(jù)讀寫效率,簡化了數(shù)據(jù)處理邏輯。HDF5[7]不僅能夠滿足測井采集軟件實時處理數(shù)據(jù)的要求,更支持跨平臺的數(shù)據(jù)存儲。
數(shù)據(jù)層主要分為3層:數(shù)據(jù)底層讀寫服務(wù)層、數(shù)據(jù)緩存層和上層數(shù)據(jù)接口層(見圖7)。
圖7 測井數(shù)據(jù)層結(jié)構(gòu)圖
數(shù)據(jù)底層讀寫服務(wù)層為上層提供數(shù)據(jù)讀寫的基本接口服務(wù)。包括了對儀器的管理,曲線對象的管理和讀寫,井場信息的讀寫。
數(shù)據(jù)緩存層主要是在軟件讀寫數(shù)據(jù)時的緩存服務(wù),減少讀寫數(shù)據(jù)文件的次數(shù),從而提升程序執(zhí)行效率。當數(shù)據(jù)訪問者修改數(shù)據(jù)后,并不會立刻寫入數(shù)據(jù)文件,因此需要把數(shù)據(jù)保存在內(nèi)存中,并通知其他的數(shù)據(jù)訪問者更新,重新讀取數(shù)據(jù)。其他插件通過數(shù)據(jù)訪問管理讀取數(shù)據(jù)時,數(shù)據(jù)訪問管理會先去查找有無數(shù)據(jù)緩存,如果有數(shù)據(jù)緩存則讀取相應(yīng)的數(shù)據(jù)并返回。如果沒有數(shù)據(jù)緩存則直接讀取底層數(shù)據(jù)并返回。外部調(diào)用保存接口時,數(shù)據(jù)訪問管理會查找出相應(yīng)的數(shù)據(jù)緩存,并通過底層數(shù)據(jù)接口寫入文件。
上層讀寫接口使用了觀察者模式實現(xiàn)數(shù)據(jù)的更新機制。使用數(shù)據(jù)接口層訪問所關(guān)注的數(shù)據(jù)后,數(shù)據(jù)服務(wù)會把此訪問者加入訂閱列表,當訪問者所關(guān)注的數(shù)據(jù)發(fā)生變化時,數(shù)據(jù)服務(wù)會直接推送數(shù)據(jù)到數(shù)據(jù)訪問者。每個需要數(shù)據(jù)并且需要數(shù)據(jù)更新獲得主動通知的地方,都需要通過數(shù)據(jù)訪問中間層創(chuàng)建一個數(shù)據(jù)訪問者。創(chuàng)建訪問者的同時,會自動注冊到數(shù)據(jù)訪問中間層,當數(shù)據(jù)訪問者訪問的數(shù)據(jù)發(fā)生變化時,數(shù)據(jù)訪問中間層會主動推送更新的數(shù)據(jù)給訪問者。
系統(tǒng)主界面如圖8所示,系統(tǒng)通過創(chuàng)建新的曲線對象擴展插件,可以實現(xiàn)新的曲線類型。
在Q-OSGi的基礎(chǔ)上,設(shè)計并實現(xiàn)的測井采集實時監(jiān)控軟件可以輕易的移植到不同的平臺中經(jīng)過編譯部署。目前已經(jīng)移植到 Window系列、Linux系列和Mac OSX系列操作系統(tǒng)。
Q-OSGi實現(xiàn)了OSGi平臺要求框架對插件的動態(tài)管理,使用start啟動某個插件,stop停止某個插件的運行。Update功能可以從服務(wù)器端動態(tài)更新某個插件。
從框架的啟動時間對Q-OSGi進行了性能測試,測試所使用的計算機配置為Intel coreTM i3 CPU、主頻2.20GHZ、2G內(nèi)存。將 Q-OSGi與其他實現(xiàn)了OSGi規(guī)范的插件框架啟動時間進行測試,其中Felix和Equniox都是基于java實現(xiàn)的。圖9為Q-OSGi與Felix和Equniox主框架的啟動時間對比測試圖。
圖8 軟件主界面
圖9 框架啟動時間對比測試圖
在可擴展性方面,Q-OSGi框架提供的擴展點機制為系統(tǒng)提供了靈活的可擴展機制,擴展對象與系統(tǒng)能夠使用簡單機制進行整合與管理。在跨平臺方面,除了數(shù)據(jù)底層之外,只需要一套代碼編譯不同平臺的版本,便可輕松實現(xiàn)多個平臺版本。在動態(tài)管理方面,Q-OSGi實現(xiàn)了對插件的動態(tài)管理,可以動態(tài)地進行更新和管理所有系統(tǒng)運行時加載的插件。在性能方面,對比其他基于java實現(xiàn)的框架而言啟動速度較快。
(1)在詳細分析OSGi規(guī)范的基礎(chǔ)上,設(shè)計并實現(xiàn)了一個基于C++的跨平臺OSGi框架實現(xiàn)方案Q-OSGi。在該框架的基礎(chǔ)上,設(shè)計并實現(xiàn)測井采集實時監(jiān)控軟件。
(2)應(yīng)用效果表明,采用OSGi技術(shù)能大幅提高軟件的可擴展性和可維護性,對軟件的開發(fā)效率和性能都有極大的提升。
[1]湯天知.EILog測井系統(tǒng)技術(shù)現(xiàn)狀與發(fā)展思路[J].測井技術(shù),2007,31(2):99-102.
[2]陳江浩,陳文輝,余衛(wèi)東,等.ACME測井采集控制管理平臺開發(fā)與應(yīng)用[J].石油儀器,2010,24(5):77-79.
[3]OSGi Service Platform[R].4.3th ed.OSGi Alliance,2012.
[4]Wu Bo.Analysis and Applied Research of OSGi Framework[D].Chengdu:Chengdu University of Technology,2009.
[5]倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計[M].北京.電子工業(yè)出版社,2006.
[6]劉玉潔,楊忠東.MODIS遙感信息處理原理與算法[M].北京:科學(xué)出版社,2001.
[7]HDF5File Format Specification[EB/OL].http:∥hd.fncsa.uiuc.edu/HDF5/doc/H5.format.html.2013-8.
[8]張云濤,龔玲.Eclipse精要與高級開發(fā)技術(shù)[M].北京:電子工業(yè)出版社,2005.