首页 文章

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

提问于
浏览
1

我目前正在使用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很好,但意味着我必须跟踪服务并且没有获得Blueprint的任何好处 .

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

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

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

1 回答

  • 3

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

    例如使用

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

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

相关问题