OSGi 捆绑为插件架构中的 SOAP Web 服务
Posted
技术标签:
【中文标题】OSGi 捆绑为插件架构中的 SOAP Web 服务【英文标题】:OSGi bundles as SOAP web services in a plugin architecture 【发布时间】:2013-04-18 08:08:05 【问题描述】:我想将 OSGi 包公开为 SOAP Web 服务,或者换句话说,发布由 OSGi 包提供的 Web 服务端点。
架构模型/想法是有一个主机 Web 应用程序,它是部署在 JBoss (5.1.0 GA) 上的普通 war 文件,提供 SOAP Web 服务接口 (JAX-WS)。此主机应用程序启动嵌入的 OSGi 框架(通过 ServletContextListener - 目前是 Equinox)并加载许多用作插件的 OSGi 包。 插件包依赖于主机应用程序,因为请求处理的一部分通过内部定义的接口委托给它们。同时,插件包还应该能够贡献自己的公共 SOAP Web 服务接口(端点实现和相应的 WSDL 文件将被应用程序服务器发布和提供)。
我们采用的第一种方法是主机 Web 应用程序部署一个调度程序/代理 servlet,它将处理委托给 OSGi 包提供的相关端点。 OSGi/Equinox (BridgeServlet/HTTPServiceServlet) 中有一个 servlet 桥接解决方案,它可以使用 HTTP 服务规范以编程方式注册 servlet(例如在插件包的 BundleActivators 中)。 问题是我有基于 SOAP 的 Web 服务端点,需要能够将它们包装在 javax.servlet.Servlet 实现中。 这通常是 Java EE 5 服务器的 WS 堆栈实现的内部,它遵循基于 servlet 的 Web 服务方法(端点在 web.xml 中定义为 servlet),并在内部用于为 Web 服务端点安装本机端点 servlet。 我没有找到这样一个可以向 HTTP 服务注册的公共端点 servlet 实现(可能类似于 com.sun.jersey.spi.container.servlet.ServletContainer 可用于为 JAX-RS 发布基于 REST 的服务OSGi 中的应用程序) 我有点惊讶于我没有发现太多关于向 OSGi HTTP 服务注册基于 SOAP 的 WS 端点的信息,或者我可能没有看到明显的情况。
我发现了类似的东西,JAX-WS-Commons/Spring(spring 支持配置 JAX-WS,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 蓝图。最后,还有一些模棱两可和不清楚的方面,不幸的是我找不到关于具有类似要求的项目的报告。
所以,我很想听听专家的一些建议或意见。 也许有一些我看不到的选项,或者也许有人以前实现过类似的项目并喜欢分享经验。 非常感谢。
【问题讨论】:
【参考方案1】:我不是专家,但我见过的另一种方法是将带有应用程序的整个应用服务器放入 OSGi 容器中。这是 Sling 启动板中的一个选项http://sling.apache.org/documentation/the-sling-engine/architecture.html#launchpad
HTH
【讨论】:
以上是关于OSGi 捆绑为插件架构中的 SOAP Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
使用 pax web 在 OSGI 容器中部署 Web 应用程序时出错
如何从 Wordpress 表单调用 SOAP Web 服务?
AEM 6.0 Web 控制台捆绑包(OSGi 捆绑包)中安装的包未正确安装(状态应为活动未安装)
YouTube API - Oauth2 流程(OSGI 捆绑包)