java - 在 "wrong"OSGi HttpService 上注册的 Servlet

标签 java servlets osgi apache-felix pax-web

我们的 OSGi 系统中存在 HttpService 冲突的问题,该系统基于嵌入在 Tomcat 中运行的 Web 应用程序中的 Apache Karaf

我们应用程序的某些部分不基于 OSGi,直接通过 WAR 中的代码响应请求,而某些部分则使用 Felix Servlet Bridge 响应请求。调用 Felix OSGi 容器中的 servlet。我们还使用Felix的白板包来实现servlet的自动注册。

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

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

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

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

最佳答案

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

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

第二个解决方案是修复 Apache Felix Whiteboard 服务,允许通过 Config Admin 将其配置为所有 Http 服务或特定服务。您还可以制作自己的白板 bundle ,它是一个非常小的 bundle ,而且非常简单,尤其是对于 DS。如果您这样做,请将其捐赠(回)给 Apache Felix。

第三种解决方案是使用服务 Hook 并确保 Whiteboard bundle 仅看到正确的 Http 服务。再次使用配置管理来配置这样的 bundle 。虽然有点hackish。

第四种解决方案,让ActiveMQ在单独的框架中运行并将其服务导出到客户端框架。不确定这是否可行,通常与面向服务的 bundle 配合得很好。这可以使用 OSGi 子系统,但不确定实现的进度。

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

关于java - 在 "wrong"OSGi HttpService 上注册的 Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16825550/

相关文章:

Java 2d 游戏平铺 map 裁剪?

java - 如何在ubuntu中将参数传递给tomcat?

java - Jsp中${param.name}和${param[name]}有什么区别

java - 适用于初学者的OSGi教程,具有最新的工具版本

Scala 库作为 OSGi 包

java - 使用 jxl API 保留 excel 格式

java - reactor lmax 线程转储

java - 私有(private)包裹的处理方式是什么?

java - Spring Boot Actuator/health 端点不显示数据库或文件系统信息

从 Web 服务器下载文件时出现 java.lang.IllegalStateException servlet 异常