我目前正在使用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 回答
是的,你错过了另一个可以工作的人使用jndi作为桥梁 . 如果使用aries(我不知道gemini)你可以检索任何OSGi服务也作为jndi查找 . 现在通过web.xml检索它,你会没事的 .
例如使用
作为你web.xml中的jndi源代码的好处,你不会遇到#2关于#3现在无法完成的问题 . 所以基本上你仍然可以选择3,但我建议使用#4