2009-07-06 71 views
4

是否有一个优雅的方式使用服务跨越之间 OSGi容器?远程处理和OSGi

这可能吗?

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

回答

9

有一个名为远程服务(以前称为分布式OSGi)的RFC,它完全符合您试图实现的目标。 RFC几乎已经完成,并且已经有2个由Apache CXF和Eclipse ECF分别提供的实现。

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

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

0

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

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

我已经省略了一些低级别的细节,但你大概可以对它进行整理。如果你可以偏离RMI,你可能想看看Riena(甚至有可能为Riena写一个RMI传输方式,我只是没有试过)

0

这不是很清楚你是什么试图实现。你有一个服务,你可以使用RMI访问它,你需要提供一个OSGi服务?

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

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

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

0

除了上述CXF,还有Eclipse的ECF,这是通信框架的集合,provies尽早落实了OSGi 4.2远程服务(又名分布式OSGi)的。它的工作方式是注册客户端绑定到虚拟机的本地服务,然后在远程计算机上创建代理,并使用您选择的技术(RMI,Web服务等)远程调用。

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

0

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

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