OSGi HTTP Bundle - 绑定到两个端口

Posted

技术标签:

【中文标题】OSGi HTTP Bundle - 绑定到两个端口【英文标题】:OSGi HTTP Bundle - Bind to two ports 【发布时间】:2013-12-03 03:54:44 【问题描述】:

我正在使用 Apache Felix HTTP Jetty 包。我可以启动 servlet 容器/HttpService 并使用系统属性将其分配给端口

org.osgi.service.http.port=8080

但我希望有两个这样的服务,绑定到两个不同的端口,例如我的应用程序 API 应该在 8080 上提供服务,但一些静态网页应该在端口 80 上提供服务。

如何在不同的端口上再次启动 HTTP 服务? 注册servlet时,如何知道哪个服务绑定了哪个端口?

编辑:对于最后一个问题,服务带有在属性中设置的端口值 org.osgi.service.http.port: 8080

【问题讨论】:

【参考方案1】:

Felix http.jetty 3.2.6 提供了一个 ManagedServiceFactory,可以轻松创建多个不同配置的 http 实例。

【讨论】:

【参考方案2】:

如果 Apache Felix HTTP Jetty 捆绑包公开了 ManagedServiceFactory,我相信您可以做到。 (编辑:它没有)

How to support virtual hosts with OSGI HttpService

http://www.codeaffine.com/2011/10/05/raprwt-osgi-integration-ii/

如果我明白了,魔法就在这里:

http://www.osgi.org/javadoc/r2/org/osgi/service/cm/ConfigurationAdmin.html#createFactoryConfiguration(java.lang.String)

如果您使用托管服务工厂的 pid 创建和注册配置,它将使用新的 Pid 创建一个新的 HttpService 实例。

【讨论】:

如果托管服务工厂服务在您支持多个 Http 服务的情况下会很有用,但我找不到任何说明 Apache Felix Http Jetty 服务器支持此功能的文档。在我的设置中,元类型表明配置是单例,而不是工厂。 eclipselabs (code.google.com/a/eclipselabs.org/p/osgi-http-service-utils) 的项目看起来很有希望...会尝试一下。 @PeterKriens 你是正确的 Apache Felix HTTP Jetty 包没有公开工厂 pid。【参考方案3】:

如果您切换到 Pax-Web,您将能够做类似的事情。 Pax-Web 支持虚拟主机,让您将某个应用程序绑定到单个连接。有关如何使用它的更多详细信息,您可以在我的两篇博文中找到:Bind web applications to specific http connectors - part 1Bind web applications to specific http connectors - part 2

【讨论】:

在 Pax-Web 中,使用码头连接器(获取多个端口)是否需要拥有完整的 Web 应用程序,或者我也可以只在 HttpService 中使用简单的 servlet 注册? 您将需要增强的 http 服务、webcontainer 服务,因此最好至少同时运行白板扩展器,让您的注册生活更轻松。请参阅第二个示例,尤其是代码示例:github.com/ops4j/org.ops4j.pax.web/blob/master/samples/…【参考方案4】:

据我所知,这对于我使用过的 OSGi 中的 Http 服务器是不可能的。在端口之间创建一个小转发器在 Java 中当然很容易。

【讨论】:

坏消息。我认为这是 ManagedServiceFactory 的用例 - 可以启动许多具有不同配置的服务。

以上是关于OSGi HTTP Bundle - 绑定到两个端口的主要内容,如果未能解决你的问题,请参考以下文章

OSGI依赖问题处理

使用 maven-bundle-plugin 安装 OSGi 依赖项

来自 Adobe 的用户体验专家 AEM 之:构建并部署 OSGi bundle

osgi笔记

带有 maven-bundle-plugin 的 OSGI JAR 包

OSGI Bundle 中的 Android Activity