4

是否有一种优雅的方式在OSGi 容器 之间之间使用服务?

甚至可能吗?

例如,假设我在本地机器上有一个服务接口。我可以使用哪些方法/技术来通过远程 OSGi 容器的 BundleContext 访问该服务接口?

4

6 回答 6

9

有一个称为远程服务(以前称为分布式 OSGi)的 RFC 可以完全满足您的要求。RFC 差不多完成了,已经有 2 个分别由 Apache CXF 和 Eclipse ECF 提供的实现。

这两种实现都允许对 OSGi 服务进行透明的远程处理。您只需像往常一样定义 OSGi 服务,并添加一些配置参数以使其成为远程服务。

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

于 2009-07-06T20:29:00.960 回答
0

检查 OSGi 规范版本 4.2 中的“远程服务”一章。它定义了在多个 OSGi 容器之间分发服务的标准方式。

OSGi 规范的全新版本 4.3 对此提供了更详细的支持 - 请参阅第 6 章远程服务和 112 远程服务管理服务。

于 2012-06-01T08:43:18.637 回答
0

这当然是可能的。查看https://docs.paremus.com//display/NIM20/Home,其中包括一个 OSGi RSA 实现,其中包括一个高性能 RMI 分发提供程序。

于 2011-02-27T15:50:11.257 回答
0

这是可能的,但没有图书馆(afaik)可以为你做这件事。我已经为我目前的工作推出了自己的产品。客户端和服务器上的 OSGi 运行时,RMI 是传输。我不得不大量使用代理对象。

在服务器的 OSGi 运行时 (Equinox) 中注册服务。我有一个监听器,它监视所有服务,寻找指示该服务应该被导出(远程)的属性/属性,例如“remotable = true”。使用 ServiceTracker 很容易过滤。通过 RMI,我指示客户端使用服务接口创建代理对象。对此代理对象的所有调用通常都通过 RMI 发回(类似 execService serviceid、方法名称、var args 参数的调用),然后在 REAL 服务上调用。

我遗漏了一些低级别的细节,但您可能可以整理出来。如果您可以远离 RMI,您可能想研究一下Riena(甚至可能有一种方法可以为 Riena 编写 RMI 传输,我只是懒得尝试)

于 2009-07-06T17:42:53.120 回答
0

目前还不是很清楚你想要达到什么目的。您有一个服务,您可以使用 RMI 访问它,并且您需要作为 OSGi 服务提供?

我想你可以为你的本地机器服务编写一个接口。然后,您可以编写一个连接到该服务并在 OSGi 服务注册表中公开该接口的包。然后,您的主包可以使用接口名称或服务名称来定位该服务。

将 RMI 连接到您的本地服务应该不会做太多工作。也许一些配置选项来建立初始连接。在将服务发布到 OSGi 之前,为服务编写外观可能很重要,以实现某种形式的解耦,并可能隐藏它是 RMI 服务的事实。

但是,也许我完全误解了你,这一切都是无用的。

于 2009-07-06T17:43:28.190 回答
0

除了上面的 CXF,还有 Eclipse ECF,它是通信框架的集合,并提供了 OSGi 4.2 远程服务(也称为分布式 OSGi)的早期实现。它的工作原理是在 VM 中注册您的客户端绑定到的本地服务,然后在远程机器上创建一个代理,并使用您选择的技术(RMI、WebServices 等)可以远程调用。

显然,这使用按值方法调用语法(您的服务需要知道),但除此之外,任何通信错误都是 RuntimeException。

于 2009-07-27T21:26:42.667 回答