陳 翥
成都飛機設(shè)計研究所,四川 成都 610041
隨著計算機技術(shù)的發(fā)展,軟件體系結(jié)構(gòu)和開發(fā)方法也在發(fā)生著重大變化。為了高效率地進行軟件開發(fā),并且開發(fā)出高質(zhì)量的產(chǎn)品,人們一直在尋求更好的軟件體系結(jié)構(gòu)和開發(fā)方法。插件式軟件體系結(jié)構(gòu)和開發(fā)方法正得到越來越多的應(yīng)用,當(dāng)前有很多成功的軟件產(chǎn)品采用此種體系結(jié)構(gòu)來開發(fā)。插件式體系結(jié)構(gòu)是一種非常靈活的組件式結(jié)構(gòu),它把程序的功能分散在插件中來完成,插件是獨立于系統(tǒng)可獨立開發(fā)的程序模塊,它能夠動態(tài)地插入到系統(tǒng)中,并且插件可以被自由地插入、刪除和替換。因此,它有著相當(dāng)突出的優(yōu)點:能夠提高軟件開發(fā)的并行性和開發(fā)效率,降低設(shè)計開發(fā)難度,縮短開發(fā)周期,增強應(yīng)用程序的可運行性、可測試性和可維護性。
成都飛機設(shè)計研究所現(xiàn)擁有OA、經(jīng)費管理、P3E等多個應(yīng)用系統(tǒng),由于各應(yīng)用系統(tǒng)之間流程未能集成,造成流程的中斷,故考慮通過RTX進行不同應(yīng)用系統(tǒng)流程間的消息推送。在不影響RTX正常使用的前提下,開發(fā)人員充分利用插件體系結(jié)構(gòu)技術(shù),自主開發(fā)了“應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件”。本文以RTX“應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件”開發(fā)為例,分析插件體系結(jié)構(gòu)軟件的設(shè)計原理與實現(xiàn)過程。
插件體系結(jié)構(gòu)是近年發(fā)展起來的一種軟件體系結(jié)構(gòu),其本質(zhì)在于不修改軟件主體的情況下對軟件功能進行擴展與加強,當(dāng)插件的接口公開后,任何公司或個人都可以制作自己的插件來解決一些操作上的不便或增加新的功能,也就是實現(xiàn)真正意義上的“即插即用”軟件開發(fā)。體系結(jié)構(gòu)見圖1:
圖1
插件軟件結(jié)構(gòu)將待開發(fā)的目標(biāo)軟件分為兩部分,一部分為程序的主體或主框架,可定義為平臺;另一部分為功能擴展或補充模塊,可定義為插件。平臺所完成的功能應(yīng)為一個軟件系統(tǒng)的核心和基礎(chǔ),這些基本功能即可為用戶使用,也可為插件使用,就是又可以把平臺功能分為兩個部分,內(nèi)核功能和插件處理功能。平臺的內(nèi)核功能是整個軟件的基礎(chǔ),一個軟件的大部分功能應(yīng)由內(nèi)核功能完成。平臺的插件處理功能用于擴展平臺和管理插件,為插件操縱平臺和與插件通信提供標(biāo)準(zhǔn)平臺擴展接口。插件所完成的功能是對平臺功能的擴展與補充。
為了實現(xiàn)插件結(jié)構(gòu)的軟件設(shè)計需要定義兩個標(biāo)準(zhǔn)接口,一個為由平臺所實現(xiàn)的平臺擴展接口;另一個為插件所實現(xiàn)的插件接口。這里需要說明的是:平臺擴展接口完全由平臺實現(xiàn),插件只是調(diào)用和使用,插件接口完全由插件實現(xiàn),平臺也只是調(diào)用和使用。平臺擴展接口實現(xiàn)插件向平臺方向的單向通信,插件通過平臺擴展接口可獲取主框架的各種資源和數(shù)據(jù)。插件接口為平臺向插件方向的單向通信,平臺通過插件接口調(diào)用插件所實現(xiàn)的功能。
那么用什么樣的方法和技術(shù)實現(xiàn)插件(程序插件),從目前已有這方面軟件的設(shè)計方法來看,一種是使用傳統(tǒng)DLL方法的實現(xiàn);另一種是使用COM方法的實現(xiàn)。
不管用那種方式實現(xiàn),平臺與插件之間必須事先定義好接口規(guī)范。對于第一種方式而言,接口規(guī)范是一系列的函數(shù),這些函數(shù)由插件DLL引出,由平臺來調(diào)用;對于第二種方式,接口規(guī)范是COM接口,插件是一個COM組件。
第二種方式在第一種方式的基礎(chǔ)上解決了跨進程、跨平臺的問題。它是一種更規(guī)范、更先進的方式,RTX也采用了這種實現(xiàn)方式。為此開發(fā)人員圍繞RTX插件體系結(jié)構(gòu)、RTX插件的管理機制、RTX接口等方面進行了深入的研究。
RTX是騰訊公司推出的基于客戶服務(wù)器架構(gòu)的企業(yè)級即時通信平臺,為滿足企業(yè)多樣化的需求,無論在服務(wù)器端還是客戶端都提供了二次開發(fā)的接口體系,為用戶在RTX平臺上開發(fā)特定的軟件功能提供了便利。本文僅以RTX客戶端(以下簡稱RTXC)為例來說明插件體系結(jié)構(gòu)的實現(xiàn)方式RTXC的體系結(jié)構(gòu)如圖1。
RTXC平臺指的是騰訊公司發(fā)布的RTX客戶端軟件,它包括了兩部分,一是RTXC的內(nèi)核功能,即RTXC的基本功能部分;二是RTXC與插件交互相關(guān)的功能,包括插件的發(fā)現(xiàn)、加載、啟用、卸載等功能。
RTXC插件則是由用戶開發(fā),實現(xiàn)了IRTXCPlugin接口的COM組件,它實現(xiàn)用戶需要的一些特殊功能,作為RTXC功能的擴充部分。
RTXC由平臺與插件兩部分組成,平臺不依賴于插件而存在,沒有插件它也能單獨運行。但插件卻需要依賴于平臺,只有它被平臺加載后才能發(fā)揮作用。另外,插件是否被啟用并不是由插件本身決定,而是由RTX客戶端用戶來決定。最后,被用戶啟用的插件還需要通過平臺進行實例化才能真正的發(fā)揮最用。
對于插件體系結(jié)構(gòu)的應(yīng)用程序,平臺的插件管理功能是必不可少的,它包括了插件的注冊、加載、啟用、停用、卸載等功能。為了實現(xiàn)插件的動態(tài)加載,平臺必須解決兩個問題,一是平臺必須知道要加載的插件放在什么地方;二是平臺必須自動確定那些插件需要被加載、啟用、停用、卸載。
在RTXC中,專門提供了一個插件管理器來進行插件的管理,該插件管理器由COM組件RTXPluginMgr來具體實現(xiàn)。對于插件存放位置的問題,RTX的解決方案是將插件統(tǒng)一的存放到應(yīng)用程序的特定目錄下,即…/TECENT/RTXC/PLUGINS/插件名稱。對于插件加載的問題,RTX將每個插件的配置信息存放到文件RTXPlugins.xml中,并根據(jù)配置文件中每個插件的標(biāo)志位AutoLoad來決定對該插件的處理方式。如果允許加載,就到配置文件中Identifier標(biāo)識的位置去加載插件。
2.2.1 未安裝插件
當(dāng)用戶未安裝插件時,PLUGINS目錄下沒有任何內(nèi)容,配置文件RTXPlugins.xml的內(nèi)容也只有簡單的兩行:
如果RTX在這種狀態(tài)下啟動,插件管理器自動讀取配置文件內(nèi)容后將不做任何操作。
2.2.2 安裝插件后
安裝插件后,RTX會自動的將插件安裝到…/TENCENT/RTXC/PLUGINS/MESSAGESENDPLUGIN路徑下,同時在配置文件中注冊應(yīng)用系統(tǒng)裝發(fā)消息插件的內(nèi)容,此時RTXPlugins.xml文件的內(nèi)容如下:
-
Name = “應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息” Description = “應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件” AutoLoad = “1” Identifier=“Tencent.RTX.MessageSendPlugin”>PluginsMessageSendPluginMessageSendPlugin.dll 如果RTX在這種狀態(tài)下啟動,插件管理器自動讀取配置文件后發(fā)現(xiàn)有應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件的信息,根據(jù)標(biāo)志位AutoLoad=“1”,確定該插件應(yīng)該加載到RTX中并啟用,然后到配置文件中指定的路徑去加載插件MessageSendPlugin.dll。 2.2.3 啟用插件 當(dāng)用戶啟用插件時,RTX自動將配置文件中該插件的標(biāo)志位AutoLoad設(shè)為1。下次啟動RTX時,RTX插件管理器將根據(jù)此加載該插件。 2.2.4 停止插件 當(dāng)用戶停止插件時,RTX自動將配置文件中該插件的標(biāo)志位AutoLoad設(shè)為0。下次啟動RTX時,RTX插件管理器將根據(jù)此加載該插件,但不啟用。 2.2.5 卸載插件 當(dāng)用戶卸載插件時,RTX自動將配置文件中該插件的標(biāo)志位AutoLoad設(shè)為2。下次啟動RTX時,RTX插件管理器將根據(jù)此從RTX平臺上刪除該插件。即刪除插件的安裝和配置信息。 在插件體系結(jié)構(gòu)中,接口在平臺于插件之間的通信起著至關(guān)重要的作用。RTX中涉及到兩類接口,一類時由平臺定義,但由插件實現(xiàn),提供給平臺調(diào)用的插件接口(見表1);另一類是由平臺定義并實現(xiàn),提供給插件調(diào)用的平臺擴展接口(見表2)。 表1 插件接口 表2 平臺擴展接口 通過RTX轉(zhuǎn)發(fā)應(yīng)用系統(tǒng)消息需要記錄每次消息轉(zhuǎn)發(fā)的全過程,同時要考慮消息接收人離線不能接收本次消息的狀況。針對這種需求,應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件設(shè)計了6種消息命令,分別標(biāo)識6種狀態(tài)。 1)CMD_MESSQGE_SEND:發(fā)送方將轉(zhuǎn)發(fā)的應(yīng)用系統(tǒng)消息發(fā)送給服務(wù)器; 2)CMD_DB_MESSAGE_SEND:服務(wù)器記錄本次消息的情況,并將消息轉(zhuǎn)發(fā)給未離線的接收方; 3)CMD_MESSAGE_LOGIN:通知服務(wù)器該賬號上線; 4)CMD_OFFLINE_MESSAGE_SEND:服務(wù)器接收到上線消息后,查詢該賬號的離線后;的消息記錄,如有則發(fā)送該賬號的離線消息記錄給該賬號; 5)CMD_MESSAGE_QUERY:發(fā)送方向服務(wù)器發(fā)送查詢本賬號歷次消息記錄的請求; 6)CMD_MESSAGE_HISTORY_SEND:服務(wù)器收到查詢消息記錄請求后,查詢數(shù)據(jù)庫記錄后返回該賬號的歷史消息信息。 在應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件的實現(xiàn)中,除了實現(xiàn)了插件最基本的接口IRTXPlugin外,還實現(xiàn)了于RTX TAB頁相關(guān)的接口,讓該插件的圖標(biāo)能出現(xiàn)在RTX下方TAB頁上供用戶實現(xiàn)歷史消息查詢操作。為了保證數(shù)據(jù)傳輸?shù)目煽啃院涂旖菪裕摬寮捎肦TX內(nèi)部通道來發(fā)送消息,調(diào)用了IRTXCRoot、IRTXCData等RTX提供的擴展接口。 插件體系結(jié)構(gòu)是一種開放的體系結(jié)構(gòu),由于它具有功能無限擴展性,為延長商業(yè)軟件的壽命起到了很重要的作用。RTX正是采用這種機制,充分利用第三方和用戶的力量不斷為其進行功能擴充,增強了RTX的生命力。 [1][美]DONBOX著.COM本質(zhì)論.潘愛民,譯.北京:中國電力出版社,2001. [2]RTX2006ClientSDK.chm.騰訊公司.2.3 RTX接口
2.4 應(yīng)用系統(tǒng)轉(zhuǎn)發(fā)消息插件的設(shè)計與實現(xiàn)
3 結(jié)論