2009-07-06 109 views
4

是否有一個優雅的方式使用服務跨越之間 OSGi容器?遠程處理和OSGi

這可能嗎?

例如,假設我在本地機器上有一個服務接口。我可以使用哪些方法/技術來通過遠程OSGi容器的BundleContext獲取該服務接口?

回答

9

有一個名爲遠程服務(以前稱爲分佈式OSGi)的RFC,它完全符合您試圖實現的目標。 RFC幾乎已經完成,並且已經有2個由Apache CXF和Eclipse ECF分別提供的實現。

這兩個實現都允許執行OSGi服務的透明遠程處理。您只需像往常一樣定義OSGi服務,並添加一些配置參數以使其成爲遠程服務。

檢查:
http://cxf.apache.org/distributed-osgi.html

0

這是可能的,但沒有庫(afaik)會爲你做這個。我已經爲我目前的工作推出了自己的產品。客戶端和服務器上的OSGi運行時,RMI是傳輸。我不得不使用代理對象。

在服務器的OSGi運行時(Equinox)中註冊服務。我有一個監聽器,監視所有查找屬性/屬性的服務,指示此服務應該導出(遠程創建),如「remotable = true」。使用ServiceTracker進行過濾很容易。通過RMI,我指示客戶端使用服務接口創建代理對象。對這個代理對象的所有調用通常通過RMI(像execService serviceid,方法名稱,var args params這樣的調用)發回,然後在REAL服務上調用。

我已經省略了一些低級別的細節,但你大概可以對它進行整理。如果你可以偏離RMI,你可能想看看Riena(甚至有可能爲Riena寫一個RMI傳輸方式,我只是沒有試過)

0

這不是很清楚你是什麼試圖實現。你有一個服務,你可以使用RMI訪問它,你需要提供一個OSGi服務?

我想你可以寫一個接口給你本地機器的服務。然後你可以編寫一個連接到該服務的包,並在OSGi服務註冊表中公開該接口。然後,您的主包可以使用接口名稱或服務名稱來定位該服務。

將RMI連接到本地服務應該不會太多工作。也許有些配置選項可以建立初始連接。在OSGi中發佈它之前,爲您的服務編寫一個外觀可能很重要,以便實現某種形式的解耦,並且可能隱藏它是RMI服務的事實。

但是,那麼也許我完全誤解了你,這一切都是沒用的。

0

除了上述CXF,還有Eclipse的ECF,這是通信框架的集合,provies儘早落實了OSGi 4.2遠程服務(又名分佈式OSGi)的。它的工作方式是註冊客戶端綁定到虛擬機的本地服務,然後在遠程計算機上創建代理,並使用您選擇的技術(RMI,Web服務等)遠程調用。

很明顯,這使用按值方法調用語法(您的服務需要知道),但除此之外,任何通信錯誤都是RuntimeException。

0

檢查OSGi規範版本4.2中的「遠程服務」一章。它定義了在幾個OSGi容器之間分配服務的標準方式。

OSGi規範的全新4.3版本對此有更詳細的支持 - 請參閱第6章遠程服務和112遠程服務管理服務。