OSGi:服务如何自动发现在运行时部署的客户端软件包?

时间:2009-12-28 00:51:44

标签: service osgi clients discover

我有一个场景,在系统安装期间,将一些服务部署到OSGi容器上,这些服务将监听其他提供数据的捆绑包,并在运行时动态安装和卸载。

这些数据提供者不公开任何服务,甚至不应该调用服务;我的想法是使预部署的服务能够监听这些数据提供程序包的安装事件,如果模式匹配,则处理并将数据保存到数据存储中。

例如,我有一个WidgetService,它将侦听Widget数据提供程序包的安装或卸载事件,ShppingCartService将侦听来自ShoppableItem数据提供程序包的安装/卸载事件等。

这有助于我保持处理和持久逻辑的集中化,我的数据提供者不需要编写任何代码来处理数据。数据提供程序包所需的全部内容是服务名称/ ID,服务版本,先决条件以及它们需要发布的数据。

我已经阅读了几篇关于OSGi的文章,这些文章解释了服务的动态可插拔性以及能够根据其可用性发现或丢弃服务的客户端;然而,这些都是关于客户要聪明地发现和执行他们感兴趣的服务的场景。

我的目的是让客户完全不知道任何服务发现,就此而言任何代码。客户端传递的所有内容都是有关客户端所在服务的信息,依赖关系以及 数据 ;客户应该是完全愚蠢的。

这在OSGi中是否可行?我已经准备好考虑这个架构,即使以扩展一些OSGi核心框架类为代价!

我找到了一些关于堆栈溢出的远程相关问题,可能是: Discovering Bundle MetaData with out installing the bundle

但是,我想要一个挂钩或事件,当安装了一个或多个数据提供程序包时,它将调用我的相应服务。这些数据提供程序包可能对系统中安装的任何服务感兴趣。我甚至准备编写一个中央bunle存储库管理器/监听器类型的东西,它将监听任何bundle安装并调用我的Service Facade,它将决定基于数据提供程序包提供的元数据执行哪些服务。

我刚刚开始OSGi,所以需要一点指导如何前进......

如果你能帮助我实现这个目标,我会非常感谢你们这些人!

我深深怀疑OSGi中可能无法提供这些内容,即使这是真的,我已准备好花时间并扩展框架来实现这一目标。我需要的只是一些指导方针和明确的方向。谁知道,如果OSGi真的缺乏这个功能,那么它将是未来OSGi规范的一个非常有用的附加组件。

我希望得到OSGi社区的帮助,

谢谢和问候, 桑巴

2 个答案:

答案 0 :(得分:2)

您可以查看OSGi Core规范的4.7节(事件)。当捆绑包的生命周期发生变化时,框架会引发 BundleEvents ,例如何时安装或卸载。您需要做的是实现 BundleListener ,然后它将接收事件,以便您的服务可以对更改做出反应。

答案 1 :(得分:0)

我已经描述了一种我称之为"OSGi Mediator"的设计模式,这可能是您问题的解决方案。

您想要调解的项目只需要在服务注册中心注册;所有依赖项都可以由您的中介实现来管理。