如何在OSGi中的服务和捆绑之间交换数据?

时间:2012-06-27 07:30:29

标签: service osgi bundle

我是OSGi的新手。无论我阅读什么教程,我都无法找到服务和捆绑之间的数据交换方式。我知道一个捆绑包必须通过服务注册表进行注册,以便其他捆绑包可以使用它们。但是,我无法获得服务和包之间的数据交换方式。与Web服务一样,数据以XML格式等交换,并使用Http协议。那么如何在服务和使用它的bundle之间交换数据。它也是通过一些协议或如何?它也涉及任何开销。请帮忙

谢谢

4 个答案:

答案 0 :(得分:6)

不涉及任何协议。您执行标准Java方法调用。

它是如何工作的基本上是这样的:

  1. 您为服务定义Java接口。只是一个普通的界面,没有什么特别的必须实现。 E.g。

    interface TimeService { public String getCurrentTime(); }

  2. 您实现了界面(在单独的包中,您不从捆绑包中导出)

  3. 您在OSGi服务注册表中注册此界面:

    timeServReg = bc.registerService(TimeService.class.getName(),                              新的TimeServiceSimple(),                              道具);

  4. 在第二个包 - 想要使用它的那个包中,您搜索此服务:

    timeRef = bc.getServiceReference(TimeService.class.getName());     if(timeRef!= null){     timeService =(TimeService)bc.getService(timeRef);   }

  5. 您只需使用刚刚获得的Java对象即可使用该服务。 你打电话给方法:

    System.out.println(“当前时间是:”+ timeService.getCurrentTime());

  6. 当然,有许多细节和良好做法,例如使用ServiceTracker查找服务等,但这是基础知识。

    您可以找到many examples here.

答案 1 :(得分:4)

OSGi服务注册表就像一个对象注册表。过度简化,它就像一个带有字符串键和对象值的地图。任何bundle都可以使用服务对象实现的接口名称将服务对象放入该映射。然后,其他包可以使用接口名称查找服务对象。它都在同一个Java VM进程中运行。因此,除了直接使用对象之外没有其他通信。 OSGi服务注册表添加了新的API以使用Java Generics和类文字。这使得使用OSGi服务注册表更安全。

另一项功能是OSGi Remote Services。它允许将服务公开给在不同Java进程(通常在不同主机上)上运行的其他OSGi框架。可用的通信有多种实现方式。一些使用Web服务(xml / http),而另一些使用直接RPC。

答案 2 :(得分:0)

数据在JVM内部基于服务接口(Java接口.class文件)进行交换,服务接口必须由服务生产者和服务使用者导入。开销应该与标准的java调用几乎相同(但如果我错了,请有人纠正我。)

现在,关于查找此类服务,使用OSGi服务注册表和服务跟踪器是一种方法,但您可能希望查看声明性服务,或者是maven SCR及其注释的包装器,作为一种更轻松地处理此问题的方法,并提供服务注入功能

答案 3 :(得分:0)

对于OSGi中的bundle之间的通信,有三种方式: 1)蓝图 2)声明性服务 3)IPOJO

蓝图类似于Spring中的DI使用Blueprint(xml文件) 声明性服务支持注释和xml。 IPOJO还支持注释和xml。