java远程处理和OSGi 3 周,4 日 Questions & Answers 2972 是否有一种优雅的方式跨或OSGi容器使用服务 有可能吗 例如,假设我在本地机器上有一个服务接口。我可以使用什么方法/技术通过远程OSGi容器的BundleContext访问该服务接口
# 1 楼答案 查看OSGi规范版本4.2中的“远程服务”一章。 它定义了在几个OSGi容器之间分发服务的标准方法 OSGi规范的全新版本4.3对此提供了更详细的支持—请参阅第6章远程服务和112远程服务管理服务
# 2 楼答案 这是可能的,但是没有库(afaik)可以为您这样做。我已经为我目前的工作做好了准备。客户端和服务器上的OSGi运行时,RMI是传输。我不得不大量使用代理对象 在服务器的OSGi运行时(Equinox)中注册服务。我有一个监听器,它监视所有服务,寻找一个属性/属性,该属性/属性指示该服务应该被导出(设为远程),类似于“remotable=true”。使用ServiceTracker很容易进行过滤。通过RMI,我指示客户端使用服务接口创建代理对象。对该代理对象的所有调用通常通过RMI(类似于execService serviceid、方法名、var args params的调用)发回,然后在实际服务上调用 我遗漏了一些低级的细节,但你可能可以把它整理出来。如果您可以离开RMI,那么您可能想研究一下Riena(甚至可能有一种方法可以为Riena编写RMI传输,我只是懒得尝试)
# 4 楼答案 你想要达到什么目标还不是很清楚。您有一个服务,您可以使用RMI访问它,并且您需要作为OSGi服务提供吗 我想你可以为你的本地机器服务写一个接口。然后,您可以编写一个连接到该服务的捆绑包,并在OSGi服务注册表中公开该接口。然后,您的主捆绑包可以使用接口名称或服务名称来定位该服务 将RMI连接到您的本地服务应该不会有太多工作。可能需要一些配置选项来建立初始连接。在OSGi中发布服务之前,为其编写一个facade可能很重要,这样可以实现某种形式的解耦,也许还可以隐藏它是一个RMI服务的事实 但也许我完全误解了你,这一切都是徒劳的
# 5 楼答案 有一个名为远程服务(以前是分布式OSGi)的RFC,它正是您想要实现的功能。RFC几乎完成了,ApacheCXF和EclipseCF分别提供了两个实现 这两种实现都允许对OSGi服务进行透明的远程处理。您只需像往常一样定义OSGi服务,并添加一些配置参数使其成为远程服务 检查: http://cxf.apache.org/distributed-osgi.html
# 6 楼答案 除了上面的CXF之外,还有EclipseECF,它是通信框架的集合,提供了OSGi4.2远程服务(也称为分布式OSGi)的早期实现。它通过在VM中注册客户端绑定到的本地服务来工作,然后在远程机器上创建代理,并使用您选择的技术(RMI、WebServices等)来远程调用 显然,这使用了按值方法调用语法(您的服务需要了解该语法),但除此之外,任何comms错误都是RuntimeException
# 1 楼答案
查看OSGi规范版本4.2中的“远程服务”一章。 它定义了在几个OSGi容器之间分发服务的标准方法
OSGi规范的全新版本4.3对此提供了更详细的支持—请参阅第6章远程服务和112远程服务管理服务
# 2 楼答案
这是可能的,但是没有库(afaik)可以为您这样做。我已经为我目前的工作做好了准备。客户端和服务器上的OSGi运行时,RMI是传输。我不得不大量使用代理对象
在服务器的OSGi运行时(Equinox)中注册服务。我有一个监听器,它监视所有服务,寻找一个属性/属性,该属性/属性指示该服务应该被导出(设为远程),类似于“remotable=true”。使用ServiceTracker很容易进行过滤。通过RMI,我指示客户端使用服务接口创建代理对象。对该代理对象的所有调用通常通过RMI(类似于execService serviceid、方法名、var args params的调用)发回,然后在实际服务上调用
我遗漏了一些低级的细节,但你可能可以把它整理出来。如果您可以离开RMI,那么您可能想研究一下Riena(甚至可能有一种方法可以为Riena编写RMI传输,我只是懒得尝试)
# 3 楼答案
当然有可能。查看https://docs.paremus.com//display/NIM20/Home,它包括一个OSGi RSA实现,其中包括一个高性能RMI分发提供程序
# 4 楼答案
你想要达到什么目标还不是很清楚。您有一个服务,您可以使用RMI访问它,并且您需要作为OSGi服务提供吗
我想你可以为你的本地机器服务写一个接口。然后,您可以编写一个连接到该服务的捆绑包,并在OSGi服务注册表中公开该接口。然后,您的主捆绑包可以使用接口名称或服务名称来定位该服务
将RMI连接到您的本地服务应该不会有太多工作。可能需要一些配置选项来建立初始连接。在OSGi中发布服务之前,为其编写一个facade可能很重要,这样可以实现某种形式的解耦,也许还可以隐藏它是一个RMI服务的事实
但也许我完全误解了你,这一切都是徒劳的
# 5 楼答案
有一个名为远程服务(以前是分布式OSGi)的RFC,它正是您想要实现的功能。RFC几乎完成了,ApacheCXF和EclipseCF分别提供了两个实现
这两种实现都允许对OSGi服务进行透明的远程处理。您只需像往常一样定义OSGi服务,并添加一些配置参数使其成为远程服务
检查:
http://cxf.apache.org/distributed-osgi.html
# 6 楼答案
除了上面的CXF之外,还有EclipseECF,它是通信框架的集合,提供了OSGi4.2远程服务(也称为分布式OSGi)的早期实现。它通过在VM中注册客户端绑定到的本地服务来工作,然后在远程机器上创建代理,并使用您选择的技术(RMI、WebServices等)来远程调用
显然,这使用了按值方法调用语法(您的服务需要了解该语法),但除此之外,任何comms错误都是RuntimeException