首页 / 软件开发 / JAVA / Java Web服务: Metro简介
Java Web服务: Metro简介2011-07-25 IBM Dennis SosnoskiMetro Web 服务栈是由 Sun Microsystems 开发的一个开源工具。它将 JAXB 2.x 数据绑定和 JAX-WS 2.x Web 服务标准的参考实现与其他与 XML 相关的 Java 标准相结合。Metro 还包括一些附加组件,以 支持基本 JAX-WS 服务的定义和使用以及 SOAP 消息交换的各种 WS-* 扩展。Metro 既可以用作独立的 Web 服务栈,也可以用作开源 Glassfish 应用服务器中的集成组件。如果 使用 Glassfish,尤其是在拥有配置基本 Web 服务和 WS-* 扩展的 GUI 工具的开源 NetBeans IDE 上进 行开发时,Web 服务配置会变得更加容易。本系列继续关注 Web 服务。以前的文章讨论 Apache Axis2 的独立使用,而不是包含 Axis2 并支持 GUI 工具的 Apache Axis2 应用服务器。本文也一样,只讨论以 独立于 IDE 的方式单独使用 Metro。Metro 基础与 Axis2本系列之前的文章已经深入讨论了 Axis2,所以本文首先讨论 Metro 与 Axis2 之间的相似点和不同 点。两者的相似点比较有限,主要围绕于使用 Web 服务开发代码的常见需求。这两个框架都允许要么从 已有的 Java 代码开始构建 Web 服务(但是,除非使用 Jibx2Wsdl 之类的单独的工具,否则 Axis2 对 这种方法的支持有限),要么从 WSDL Web 服务描述开始,生成使用或实现服务的 Java 代码。这两个框 架都是将服务操作建模为方法调用,而将服务端口类型建模为接口。Metro 与 Axis2 之间的不同点比相似点要鲜明得多。从基础上讲,Metro 是围绕 JAXB 2.x 和 JAX- WS 2.x 设计的,无意支持这两种技术以外的任何替代技术(除了遗留的 JAX-RPC 的使用)。而 Axis2 则被设计为支持无限种技术,尤其是在 XML 数据绑定领域。虽然它包括对 JAXB 2.x 和 JAX-WS 2.x 的 支持,但是二者并无特殊地位。(如果说有的话,也仅限于 JAX-WS 某种意义上是 Axis2 中的第二类方 案,原因正如 “Axis2 中的 JAXB 和 JAX-WS” 中所述,无法为 JAX-WS 服务配置 WS-Security 或其他 特性)。从结构上讲,两种栈在处理请求和响应时都使用处理器。Axis2 以这种处理器方法为基础实现模块: 基本 SOAP 消息交换的可插拔扩展,用于以高度可配置的方式实现 WS-* 技术。Metro 支持多种实现处理 器的 WS-* 技术,但是这些技术都被集成到 Metro 引擎,而不是作为可分离组件。Metro 使用的集成方 法不如 Axis2 模块灵活,但是在配置和使用 WS-* 扩展方面有一些优势。在客户端代码如何使用 WSDL 服务定义方面,这两种栈之间也有不同。Axis2 主要将 WSDL 服务定义 用于客户端代码生成,从 WSDL 中提取服务定义信息,并生成代码,以在运行时构造匹配的 Axis2 客户 端配置(不过也可以在运行时解析 WSDL 定义)。JAX-WS 2.x,当然还有 Metro,在运行时都需要 WSDL 服务定义,以便构建服务定义。在运行时使用 WSDL 会增加启动开销 — 不过仅限于第一次服务调用 — 没有任何明显的优点。在服务器端也有不同之处。对于常见的 HTTP 传输,Axis2 通常作为单独的 Web 应用程序(一个 WAR 程序),另外还有任意数量的服务被部署到该 Axis2 Web 应用程序(不过也可以将它打包到应用程序 WAR 中)。可以通过 Web 页面上传部署服务,也可以通过直接将 Axis2 服务 AAR 文件拖放到扩展的 Axis2 Web 应用程序的适当目录中来部署服务。通常,在构建时,Axis2 从 WSDL 服务定义生成各个服务 的配置信息,然后将其包括在服务 AAR 文件中。标准的 Axis2 Web 应用程序还通过 Web 页面提供多种 监视和控制工具。相反,Metro 要求为每个 Web 服务应用程序构建单独的 WAR 文件,而 Metro 库 JAR 文件要么包括 在 WAR 中,要么包含在类中(作为 HTTP 服务器的一部分),WAR 中还有一个 WEB-INF/web.xml 文件, 该文件引用服务和 Metro servlet。当单独使用 Metro 时,还需要创建一个 sun-jaxws.xml 配置文件, 该文件提供关于服务配置的附加信息。这些配置文件中的信息与实际 Web 服务类中的 JAX-WS 注释相结 合,一同为服务配置 Metro。由于 Metro 被设计为以这种嵌入式的方式使用,所以不提供任何直接监视 或控制的工具。Axis2 和 Metro 都提供集成的 HTTP 服务器支持。对于 Metro,这是通过 JAX-WS 特性 javax.xml.ws.Endpoint 类提供的。Axis2 和 Metro/JAX-WS 的集成 HTTP 服务器都适合在测试中使用, 或者作为异步响应端口,但是不能容纳生产 Web 服务,对于生产 Web 服务,可以使用支持 Servlet API 的 Java 应用服务器。示例应用程序代码下载 部分提供了本系列之前文章中使用的简单的书库管理服务的一个版本,该版本经过了修改, 以演示 Metro 的使用。和之前的版本一样,WSDL 服务定义一共定义 4 个操作:getBook,用于获取国际标准书号(International Standard Book Number,ISBN)标识的特定图书的 详细信息getBooksByType,用于获取某种类型的所有图书的详细信息getTypes,用于发现现有的图书类型addBook,用于将新的图书添加到书库在 “Axis2 中的 JAXB 和 JAX-WS” 中,您看到了这个应用程序在 Axis2 中如何工作:首先使用 JAXB 2.x 数据绑定生成代码,然后进行 JAX-WS 2.x 服务配置。该文章的大部分内容也适用于使用 Metro 的情况。除了服务名称和端点地址不同外,WSDL 是相同的,生成的 JAXB 数据模型是相同的,甚 至生成的服务类也是相同的,只是 Java 包和 JAX-WS 注释中使用的服务名称不同。