基于OSGi的動(dòng)態(tài)化系統(tǒng)搭建
搭建動(dòng)態(tài)化的系統(tǒng)是作為Java開(kāi)發(fā)人員一直就非常追求的目標(biāo),一個(gè)系統(tǒng)能夠動(dòng)態(tài)化就意味著:
51CTO編輯推薦:OSGi入門(mén)與實(shí)踐全攻略
◆ 添加新功能時(shí)不需要重啟系統(tǒng);
◆ 修改已存在的功能時(shí)不需要重啟系統(tǒng);
◆ 刪除一些不需要的功能時(shí)不需要重啟系統(tǒng);
◆ 修改系統(tǒng)中的配置時(shí)可以不需要重啟系統(tǒng)即刻生效;
◆ 系統(tǒng)的業(yè)務(wù)行為可動(dòng)態(tài)的改變。
也許習(xí)慣了傳統(tǒng)Java開(kāi)發(fā)方式的人而言,沒(méi)有這些動(dòng)態(tài)化也沒(méi)什么,但不可否認(rèn),這些動(dòng)態(tài)化的特征還是非常吸引人的,尤其是如果能很容易就獲得這些好處,那么自然就不會(huì)錯(cuò)過(guò)這些好處了,基于OSGi可以很容易的讓我們獲取到這些好處,對(duì)于上面所描述的系統(tǒng)的動(dòng)態(tài)化的特征可以歸納為這么三點(diǎn):
◆ 模塊的動(dòng)態(tài)化:新增、修改、刪除以及擴(kuò)展;
◆ 配置的動(dòng)態(tài)化;
◆ 行為的動(dòng)態(tài)化。
下面就來(lái)看看基于OSGi是怎么樣來(lái)構(gòu)成這樣的動(dòng)態(tài)化的系統(tǒng)的。
◆ 模塊的動(dòng)態(tài)化:新增、修改、刪除以及擴(kuò)展;
● 新增
對(duì)于模塊的新增,在OSGi可以通過(guò)在控制臺(tái)中使用install命令去安裝,或者調(diào)用BundleContext的installBundle方法去安裝新的模塊;
● 修改
當(dāng)修改了模塊后,只需在控制臺(tái)中使用update命令去更新模塊,或者通過(guò)調(diào)用BundleContext.getBundle(Bundle的id).update();
● 刪除
當(dāng)需要?jiǎng)h除不需要了的模塊時(shí),只需在控制臺(tái)中使用uninstall命令去刪除,或者通過(guò)調(diào)用BundleContext.getBundle(Bundle的id).uninstall();
● 擴(kuò)展
對(duì)于模塊的擴(kuò)展,可以使用OSGi所支持的調(diào)用多服務(wù)的方式或者使用Equinox提供的擴(kuò)展點(diǎn)的方式來(lái)實(shí)現(xiàn)。
◆ 配置的動(dòng)態(tài)化
對(duì)于配置的動(dòng)態(tài)化方面,使用OSGi的Configuration Admin Service(簡(jiǎn)稱(chēng)CM)可以很容易的實(shí)現(xiàn),使用CM使得系統(tǒng)中的配置可以采用統(tǒng)一的形式去管理、動(dòng)態(tài)的通知變化以及使用。
◆ 行為的動(dòng)態(tài)化
系統(tǒng)在運(yùn)行中要根據(jù)業(yè)務(wù)的需求選擇相應(yīng)的服務(wù)是經(jīng)常會(huì)碰到的需求,例如一份文件在某種情況下可能需要進(jìn)行存儲(chǔ),而在另一種情況下可能是需要進(jìn)行提取信息并存儲(chǔ)為其他文件,由于OSGi支持服務(wù)選擇時(shí)的過(guò)濾(如context.getAllServiceReferences(服務(wù)接口完整類(lèi)名,"(key=db)")),使得系統(tǒng)可以在運(yùn)行時(shí)根據(jù)需求來(lái)選擇或配置使用相應(yīng)的服務(wù),而OSGi同時(shí)又支持了服務(wù)的動(dòng)態(tài)化的管理,當(dāng)服務(wù)可用時(shí)會(huì)自動(dòng)的通知,當(dāng)其不可用時(shí)同樣會(huì)自動(dòng)的通知,這就保證了開(kāi)發(fā)人員在使用服務(wù)時(shí)可做出相應(yīng)的處理。
如果覺(jué)得你所設(shè)計(jì)的系統(tǒng)需要這些動(dòng)態(tài)化的特征的話(huà),那么建議使用下OSGi(推薦的OSGi框架:Equinox)試試,或者可以參考下OSGi的實(shí)現(xiàn)方法自己去實(shí)現(xiàn)所需要的動(dòng)態(tài)化的特征。
【編輯推薦】