1

我目前正在使用 Pax Web 部署 OSGi Web 应用程序包。从这个 Web 包中,我需要访问一组 OSGi 服务。在系统的其余部分,我使用蓝图来创建和使用服务。这很棒,因为它提供了代理、阻尼等。

从 Pax Web 部署的 Web 应用程序包中,访问这些 OSGi 服务的最佳方式是什么?

我的想法是

1)通过osgi-bundlecontext属性从ServletContext中获取BundleContext,然后使用OSGi ServiceTracker类。

2) 在 Web 包中创建一个蓝图上下文文件,其中包含对我需要的服务的引用。Blueprint 上下文由 Blueprint 扩展程序在 OSGi 服务注册表中注册,我可以从中检索它,然后按 id 查找 bean。

3) 使用 Springs ContextLoaderListener 之类的东西在 web.xml 文件中创建蓝图上下文。

选项 1 很好,但意味着我必须跟踪服务并且无法获得蓝图的任何好处。

选项 2 也可以正常工作,只是遇到时间问题。实际上,现在有两个服务正在部署应用程序 - 使用 web.xml 文件部署的 Pax Web 扩展器和部署蓝图上下文文件的(在我的例子中是 Gemini)蓝图扩展器。在启动时,这些扩展程序会同时部署,并且当 Pax Web 扩展程序实例化任何 servlet 上下文侦听器时,无法保证应用程序上下文在 OSGi 服务注册表中可用。这意味着不能从上下文侦听器代码调用 OSGi 服务。

选项 3 - 不太确定是否可以这样做。看起来 Spring DM 曾经使用过这种方法?

我觉得我一定遗漏了一些东西 - 有没有一种简单的方法可以从 Pax Web 部署的 Web 包中使用蓝图?

4

1 回答 1

3

是的,你错过了另一个可以使用 jndi 作为桥梁的工具。如果使用 aries(虽然我不知道双子座),您也可以检索任何 OSGi 服务作为 jndi 查找。现在通过 web.xml 检索它,你会没事的。

例如使用

osgi:service/<interface>[/<filter>]

作为来自 web.xml 的 jndi 源 这样做的好处是,您不会遇到现在无法完成的 #2 关于 #3 的问题。所以基本上你仍然可以选择 3 但我建议使用 #4

于 2012-10-22T20:32:30.957 回答