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

Service OSGi中的服务和捆绑包之间如何交换数据?,service,osgi,bundle,Service,Osgi,Bundle,我是OSGi的新手。无论我读了什么教程,我都无法找到服务和捆绑包之间如何交换数据。我知道一个包必须在ServiceRegistry中注册自己,以便其他包可以使用它们。但是,我无法了解服务和捆绑包之间的数据是如何交换的。与web服务中一样,数据以XML格式或类似格式交换,并使用Http协议。因此,如何在服务和使用它的捆绑包之间交换数据。它是否也通过某种协议或如何实现?而且它是否涉及任何开销。请帮忙 感谢数据在JVM内部交换,基于服务生产者和服务消费者都必须导入的服务接口(Java Interfac

我是OSGi的新手。无论我读了什么教程,我都无法找到服务和捆绑包之间如何交换数据。我知道一个包必须在ServiceRegistry中注册自己,以便其他包可以使用它们。但是,我无法了解服务和捆绑包之间的数据是如何交换的。与web服务中一样,数据以XML格式或类似格式交换,并使用Http协议。因此,如何在服务和使用它的捆绑包之间交换数据。它是否也通过某种协议或如何实现?而且它是否涉及任何开销。请帮忙


感谢

数据在JVM内部交换,基于服务生产者和服务消费者都必须导入的服务接口(Java Interface.class文件)。开销应该和标准java调用差不多(但是如果我错了,请有人纠正我)


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

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


另外一个特性是OSGi远程服务。它允许向运行在不同Java进程(通常在不同主机上)中的其他OSGi框架公开服务。有多种可用的通信实现。一些使用web服务(xml/http),另一些使用直接RPC。

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

它的工作原理基本上是这样的:

  • 您可以为您的服务定义一个Java接口。只是一个普通的接口,不需要实现任何特殊的功能。例如

    接口时间服务{ 公共字符串getCurrentTime(); }

  • 您实现了接口(在一个单独的包中,您不会从包中导出)

  • 您可以在OSGi服务注册表中注册此接口:

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

  • 在第二个捆绑包(即希望使用它的捆绑包)中,您搜索此服务:

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

  • 您只需使用刚刚获得的Java对象即可使用该服务。 您可以调用以下方法:

    System.out.println(“当前时间为:+timeService.getCurrentTime())

  • 当然有很多细节和良好的实践,比如使用ServiceTracker查找服务等,但这是基础


    您可以在OSGi中找到捆绑包之间的通信有三种方式: 1) 蓝图 2) 声明性服务 3) 伊波乔

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

    我尝试了类似的方法,但遇到了类强制转换异常。示例链接似乎已断开,请提供它