2012-10-22 27 views
1

我目前使用Pax Web部署OSGi Web應用程序包。從這個Web捆綁包中,我需要訪問一組OSGi服務。在系統的其他部分,我使用Blueprint來創建和使用服務。這非常棒,因爲它提供了代理,阻尼等功能。如何從Pax Web部署的Web捆綁包中訪問(Blueprint)OSGi服務?

從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?

回答

3

是的,你錯過了另一個將工作 使用jndi作爲橋樑。 如果使用白羊座(雖然我不知道雙子座),但您也可以在jndi查找時檢索任何OSGi服務。現在通過web.xml檢索這個,你會沒事的。

例如使用

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

爲您的JNDI源從你的web.xml 這樣做的好處,你沒有碰上#2 問題關於#3,不能做馬上。 所以基本上你仍然有3的選擇,但我建議使用#4

+0

我忘了JNDI!我會放棄它。剛剛找到[本文](http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.osgi.nd.multiplatform.doc%2Ftopics%2Fca_blueprint_jndi。 html),它對你所說的有點擴展。希望它能在Gemini/JBoss7中得到支持。 – pauli

+0

我用Apache Karaf和Apache白羊座成功了,保持我的手指交叉它也適用於雙子座:) –