我是 OSGi 的新手。无论我阅读什么教程,我都无法找到服务和捆绑包之间的数据交换方式。我知道一个包必须在服务注册表中注册,以便其他包可以使用它们。但是我无法了解服务和捆绑包之间的数据是如何交换的。与 Web 服务一样,数据以 XML 格式或类似并使用 Http 协议进行交换。那么数据是如何在服务和使用它的包之间交换的。它也是通过某种协议还是如何?而且它是否涉及任何开销。请帮忙
谢谢
不涉及任何协议。您执行标准的 Java 方法调用。
它的工作原理基本上是这样的:
您为您的服务定义一个 Java 接口。只是一个普通的接口,没有什么特别的实现。例如
接口 TimeService { public String getCurrentTime(); }
你实现了接口(在一个单独的包中,你不会从你的包中导出)
您在 OSGi 服务注册表中注册此接口:
timeServReg = bc.registerService(TimeService.class.getName(), new TimeServiceSimple(), props);
在第二个捆绑包 - 想要使用它的捆绑包中,您搜索此服务:
timeRef = bc.getServiceReference(TimeService.class.getName()); if (timeRef != null) { timeService = (TimeService) bc.getService(timeRef); }
您只需使用刚刚获得的 Java 对象即可使用该服务。您调用方法:
System.out.println("当前时间为:" + timeService.getCurrentTime());
当然有很多细节和好的做法,例如使用 ServiceTracker 来查找服务等,但这是基础。
你可以在这里找到很多例子。
OSGi 服务注册表就像一个对象注册表。过于简单化,它就像一个带有字符串键和对象值的映射。任何捆绑软件都可以使用服务对象实现的接口名称将服务对象放入该映射中。然后其他包可以使用接口名称查找服务对象。它都在同一个 Java VM 进程中运行。因此,除了直接使用对象之外,没有其他通信。OSGi 服务注册表添加了新的 API 以使用 Java 泛型和类文字。这使得使用 OSGi 服务注册表更安全。
另一个特性是 OSGi 远程服务。它允许向运行在不同 Java 进程(通常在不同主机上)中的其他 OSGi 框架公开服务。可用的通信有多种实现方式。有些使用 Web 服务 (xml/http),有些使用直接 RPC。
数据在 JVM 内部交换,基于服务生产者和服务消费者都必须导入的服务接口(Java 接口 .class 文件)。开销应该与标准 java 调用几乎相同(但如果我错了,请有人纠正我)。
现在,至于查找此类服务,使用 OSGi 服务注册表和服务跟踪器是一种方法,但您可能希望查看声明式服务,或者它的包装器,即 maven SCR及其注释,作为处理更多的方法轻松,并提供服务注入功能
对于 OSGi 中的包之间的通信,有三种方式:1)蓝图 2)声明式服务 3)IPOJO
Blueprint 类似于 Spring 中的 DI,使用 Blueprint(xml 文件) 声明式服务同时支持注解和 xml。IPOJO 还支持注解和 xml。