2012-06-27 28 views
3

我是OSGi的新手。無論我讀的教程是什麼,我都無法找到數據在服務和包之間交換的方式。我知道一個bundle必須使用服務註冊表註冊,以便其他bundle可以使用它們。但是我無法弄清楚服務和包之間的數據是如何交換的。就像在Web服務中一樣,數據以XML格式或類似方式進行交換,並使用Http協議進行交換。那麼如何在服務和使用它的包之間交換數據。它也是通過一些協議或如何?而且它也涉及任何開銷。請幫助OSGi中的服務和包之間的數據交換如何?

感謝

回答

3

不涉及任何協議。你做標準的Java方法調用。

工作原理基本是這樣的:

  1. 您定義的Java接口爲您服務。只是一個普通的界面,沒有什麼特別的必須實施。例如。

    interface TimeService {0} public String getCurrentTime(); }

  2. 您實現該接口(在一個單獨的包,你沒有從你的包導出)

  3. 您在OSGi服務註冊表註冊該接口:

    timeServReg = BC。 registerService(TimeService.class.getName(), new TimeServiceSimple(), props);

  4. 在第二束 - 想要使用它的人,你搜索這個服務:

    timeRef = bc.getServiceReference(TimeService.class.getName());如果(timeRef!= null){time} =(TimeService)bc。的getService(timeRef); }

  5. 您只需使用剛剛獲得的Java對象即可使用該服務。 您打電話給我的方法:

    System.out.println(「當前時間爲:」+ timeService.getCurrentTime());

當然有很多細節和良好的做法,例如使用ServiceTracker來尋找服務等,但這是基礎知識。

你可以找到many examples here.

+0

謝謝..它真的幫了 – user1147070

+0

我嘗試過類似的方法,類拋出異常。示例鏈接似乎被破壞,請您提供它 – Praful

0

數據在JVM中的內部交換的基礎上,必須由服務生產和服務消費兩個導入服務接口(Java接口的.class文件)。開銷應該與標準的Java調用非常相似(但如果我錯了,請別人糾正我)。

現在,關於查找這樣的服務,使用OSGi服務註冊表和服務跟蹤器是一種方法,但您可能想要查看聲明性服務或者它的包裝器maven SCR及其註釋,作爲一種方式以更輕鬆地處理此問題,並提供服務注入功能

3

OSGi服務註冊表就像對象註冊表。過度簡化,就像一個帶有字符串鍵和對象值的映射。任何包都可以使用由服務對象實現的接口的名稱將服務對象放入該映射中。其他bundle可以使用接口名稱查找服務對象。它們都在相同的Java VM進程中運行。因此,除了直接使用對象之外,沒有其他的溝通。 OSGi服務註冊表添加了新的API來處理Java泛型和類文字。這使得OSGi服務註冊表更加安全。

另一個功能是OSGi遠程服務。它允許將服務公開給在不同Java進程中運行的其他OSGi框架(通常位於不同的主機上)。可用的通信有多種實現。有些使用Web服務(xml/http),而其他使用直接RPC。

0

對於OSGi包之間的溝通方式有三種: 1)藍圖 2)聲明式服務 3)IPOJO

藍圖是用藍圖類似DI在Spring( xml文件) 聲明性服務同時支持註釋和xml。 IPOJO也支持註釋和XML。

相關問題