如何从Pax Web部署的Web捆绑包访问(蓝图)OSGi服务?

时间:2012-10-22 12:12:39

标签: java osgi blueprint-osgi pax-web eclipse-gemini

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

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

我的想法是

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

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

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

选项1很好,但意味着我必须跟踪服务而不会获得蓝图的任何好处。

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

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

我觉得我必须遗漏一些东西 - 是否有一种简单的方法可以使用蓝图 Pax Web部署了Web捆绑包吗?

1 个答案:

答案 0 :(得分:3)

是的,你错过了另一个能奏效的人 使用jndi作为桥梁。 如果使用aries(我不知道gemini)你可以检索任何OSGi服务也作为jndi查找。现在通过web.xml检索它,你会没事的。

例如使用

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

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