1

基于嵌入HttpService在. _OSGiApache KarafTomcat

我们应用程序的某些部分是非OSGi基于的,直接通过我们的代码响应请求WAR,而某些部分通过Felix Servlet Bridge调用Felix OSGi容器中的 servlet 来响应请求。我们也在使用Felix's whiteboard bundle 来实现 servlet 的自动注册。

我们也在使用 中的ActiveMQ功能Karaf,它包含Pax Web在它的控制台中。结果是我们最终得到一个HttpService来自 的Felix Servlet Bridge,它与嵌入应用程序服务器集成,另一个HttpService来自,它在不同的端口上Pax Web运行它自己的服务器。Jetty

所以,问题是一些初创公司的白板包连接到了Pax Web HttpService,因此将我们的 servlet 暴露在错误的位置。我们还没有找到一种方法来配置白板包以某种方式请求所需的HttpServicefrom Servlet Bridge,并且由于所有涉及的包都是第三方的东西,我们也希望避免更改它们的Java代码......

解决这个问题的最佳方法是什么?

(为了可维护性,我们更喜欢配置而不是代码,并且我们希望将ActiveMQ控制台保持在自己的端口上)

4

1 回答 1

1

在应用服务器中运行,然后在其中运行另一个 Web 服务器,这听起来像是一个奇怪(而且相当浪费)的设置......猜猜你有你自己造成的复杂性的原因:-)

第一个也是最简单的解决方案可能是不使用白板并使用声明性服务引用,然后只注册给定的 http 服务。然后您可以使用 Config Admin 设置 Http Service 引用的目标过滤器。或者,您可以在所有 Http 服务中注册。

第二种解决方案是修复 Apache Felix Whiteboard 服务,允许通过 Config Admin 将其配置为所有 Http 服务或特定服务。您也可以制作自己的白板包,它是一个非常小的包并且非常简单,尤其是使用 DS。如果你愿意,请将它(返回)捐赠给 Apache Felix。

第三种解决方案是使用服务挂钩并确保白板包只看到正确的 Http 服务。再次使用 Config Admin 来配置这样的包。不过有点hackish。

第四种解决方案,让 ActiveMQ 在单独的框架中运行并将其服务导出到客户端框架。不确定这是否可行,通常与面向服务的捆绑包一起工作得很好。这可以使用 OSGi 子系统,但不确定实现有多远。

最后一个解决方案,将是我的偏好,摆脱问题并让 ActiveMQ 在适当保护的路径下的桥 Web 服务器上运行,或者使用 Jetty 作为您的 Web 服务器并跳过 Tomcat。

于 2013-05-30T08:53:40.107 回答