我目前正在使用 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 包中使用蓝图?