OSGi在插件架构中捆绑为SOAP web服务



我想公开OSGi包作为SOAP web服务,或者换句话说,发布由OSGi包提供的web服务端点。

架构模型/思想是有一个主机web应用程序,它是一个普通的war文件,部署在JBoss (5.1.0 GA)上,提供SOAP web服务接口(JAX-WS)。
这个主机应用程序启动OSGi框架嵌入(通过ServletContextListener -目前是Equinox),并加载一些OSGi包作为插件。
插件包依赖于主机应用程序,因为请求处理的一部分通过内部定义的接口委托给它们。
同时,插件包还应该能够提供自己的公共SOAP web服务接口(端点实现和各自的WSDL文件将被发布,并由应用服务器提供)。

我们采用的第一种方法是主机web应用程序部署一个分派器/代理servlet,它将处理委托给OSGi包提供的相关端点。在OSGi/Equinox中有servlet桥接解决方案(BridgeServlet/HTTPServiceServlet),它允许使用HTTP服务规范对servlet进行程序化注册(例如,在插件包的BundleActivators中)。问题是我有基于soap的web服务端点,并且需要能够将它们包装在javax.servlet.Servlet实现中。这通常是Java EE 5服务器的WS栈实现的内部,它遵循基于servlet的web服务方法(端点在web.xml中定义为servlet),并在内部用于为web服务端点安装本机端点servlet。我没有找到这样一个公共端点servlet实现,它可以注册到HTTP服务(可能类似于com.sun.jersey.spi.container.servlet.ServletContainer,它可以用来发布基于rest的服务,用于OSGi中的JAX-RS应用程序)
让我有点惊讶的是,我没有找到那么多关于使用OSGi HTTP服务注册基于soap的WS端点的信息,或者可能是我没有看到明显的信息。

我发现了类似的东西,JAX-WS- commons/Spring(配置JAX-WS的Spring支持,http://jax-ws-commons.java.net/spring/),它在内部使用JAX-WS RI (metro)的WSServletDelegate类来处理端点的web请求。但我不确定,它似乎有点过时,我需要提供metro WS堆栈jar给JBoss(或在war文件中),以使其在JBoss 5.1.0 GA上工作。

另一种方法似乎是分布式OSGI,它允许发布OSGI服务用于远程访问。但是,我找不到关于如何在JBoss上提供这些服务作为web服务的明确信息。

其他实现方面有:

  • 我们被绑定到JBoss 5.1.0 GA,对JBoss配置的更改应该尽可能少(为了对我们的客户设置有最小的约束)
  • 所有web服务都是契约优先开发的,这意味着原始WSDL将由提供服务的容器使用。
  • 插件组件应该尽可能简单地涉及依赖项或技术(为了对插件开发人员的技能有最小的要求)
  • 我们使用Spring 3和Gemini Blueprint。

最后,有一些含糊不清的方面,不幸的是,我找不到类似需求的项目报告。

所以,我很想听听专家们的一些建议或评论。也许有我没有看到的选项,或者也许有人以前实现过类似的项目,喜欢分享经验。
非常感谢。

我不是专家,但我看到的另一种方法是将整个应用程序服务器与应用程序放入OSGi容器中。它是Sling发射台中的一个选项http://sling.apache.org/documentation/the-sling-engine/architecture.html#launchpad

HTH

最新更新