2013-05-29 46 views
1

我們的嵌入在Tomcat中運行的Web應用程序的OSGi系統中基於Apache Karaf存在衝突HttpService的問題。在「錯誤的」OSGi上註冊的Servlets HttpService

我們的應用程序的某些部分是非OSGi基礎,直接通過代碼在我們WAR響應請求,以及一些地區使用Felix Servlet Bridge來調用FelixOSGi容器的servlet響應請求。我們還使用Felix的白板捆綁來實現servlet的自動註冊。

我們也使用Karaf中的ActiveMQ功能,它的控制檯包含Pax Web。其結果是,我們最終得到,Felix Servlet Bridge與嵌入式應用服務器集成的HttpService和來自Pax WebHttpService,它們在不同的端口上運行其自己的Jetty服務器。

所以,問題是一些初創公司的白板捆綁連接到Pax Web HttpService,從而暴露我們的servlet在錯誤的地方。我們還沒有找到一種方法來配置白板捆綁以某種方式請求從Servlet Bridge期望的HttpService,並且由於所有涉及的捆綁包都是第三方的東西,我們希望避免更改它們的Java代碼以及...

解決此問題的最佳方法是什麼?

(我們寧願在可維護性代碼配置,我們希望保持自己的端口上ActiveMQ控制檯)

回答

1

這聽起來像一個奇怪的(有點浪費)安裝在應用程序服務器上運行,然後運行另一個Web服務器......猜猜你有這個自我造成的複雜性的原因:-)

第一個也是最簡單的解決方案可能是不使用白板並使用Declarative Services引用,然後只註冊給定的http服務。然後,您可以使用Config Admin爲Http Service參考設置目標過濾器。或者,您可以在所有Http服務中註冊。

第二種解決方案是修復Apache Felix白板服務,允許通過配置管理將其配置爲所有Http服務或特定服務。您也可以製作自己的白板捆綁包,這是一個非常小的捆綁包,非常小巧,特別是在DS中。如果你願意,請捐贈給Apache Felix。

第三種解決方案是使用服務掛鉤並確保白板捆綁只能看到正確的Http服務。再次使用Config Admin來配置這樣的軟件包。有點hackish,但。

第四種解決方案,讓ActiveMQ在單獨的框架中運行並將其服務導出到客戶端框架。不確定這是否可行,通常與服務導向捆綁一起工作。這可以使用OSGi子系統,但不知道這個實現有多遠。

最後的解決方案,將是我的首選,擺脫問題,並讓ActiveMQ在適當保護的路徑下在網橋服務器上運行,或者使用Jetty作爲您的Web服務器並跳過Tomcat。

+0

我第二次在這個彼得,我會使用卡拉夫獨立,而不是將它嵌入到一個tomcat內。除此之外,您是否已經嘗試在Pax-Web上使用servlet橋? –

+0

內部安全規則禁止我們將管理功能放在用戶可訪問的相同端口上,即使我們已經實施了路徑保護。我希望能夠儘可能地重用盡可能多的庫功能(白板等),並保持我們自己的代碼小,但似乎我需要放入一些額外的代碼來使這項工作。所以目前解決方案(1)和(2)看起來最好。謝謝! – mikewse

+0

最終解決方案三(ServiceHooks)證明是我們最好的解決方案。謝謝大家! – mikewse