【问题标题】:How to access a (Blueprint) OSGi service from a Pax Web deployed web bundle?如何从 Pax Web 部署的 Web 包访问(蓝图)OSGi 服务?
【发布时间】:2012-10-12 06:00:40
【问题描述】:

我目前正在使用 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 部署的网络包?

【问题讨论】:

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


    【解决方案1】:

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

    例如使用

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

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

    【讨论】:

    • 我忘记了 JNDI!我会试一试的。刚刚找到this article,它扩展了你所说的内容。希望它会在 Gemini/JBoss7 中得到支持。
    • 我在 Apache Karaf 和 A​​pache Aries 上取得了成功,祝你好运,它也适用于 Gemini :)
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2023-03-13
    • 2022-11-04
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多