![]() developerWorks 中国 > Open source | Java technology | SOA and Web services > ![]() 使用 Apache Geronimo 将 Apache Axis 应用程序移植到 Axis2![]() |
![]() |
![]() |
级别: 中级 Tyler Anderson ([email protected]), 自由作家, Stexar Corp. 2006 年 8 月 31 日 随着 Apache Axis 及其最新产品 —— Axis2 的出现,在 Apache Geronimo 上开发 Web 服务已经变得非常轻松并且也不太繁琐了。Axis2 是对 Axis 的重要改进,这是因为在 Axis2 上实现了更好的体系结构,简化了开发,并且 Axis2 提供了更多的数据绑定支持。本文介绍如何使用示例 Web 服务,以及如何将以前在 Axis 中开发的 Web 服务迁移到 Axis2 中。将讨论 Axis2 与 Axis 相比的多种改进和提高,以及这与在 Geronimo 应用服务器上部署新移植的 Axis2 Web 服务有什么关联。 介绍 Apache Axis 和 Axis2 专门用来优化创建 Web 服务的过程。通过 Web Services Description Language(WSDL),Axis 和 Axis2 都将自动生成 Java™ 类 —— 使用 WSDL2Java 工具 —— 这是在 Apache Geronimo 上构造和部署 Web 服务所必需的。 Apache Axis 项目是作为 Apache 简单对象访问协议(SOAP)项目的后续项目开始的,用于实现 Web 服务,它是一种非常优秀的技术。事实上,有好几家公司都将 Axis 作为在其产品中开发和实现 Web 服务的方法。 Axis2 通过一个新的模块化体系结构提供了比 Axis 更高的性能。Axis2 Apache Web 站点报道说,“Apache Axis2 ...[构建]在 Axis1 中开发的 ‘handler chain’ 模型上之上 ... Axis2 引入了更加灵活的管道体系结构,从而实现更模块化、更具有可扩展性。这种可扩展性将允许 Axis2 作为大量不断增长的相关 Web 服务协议的基础...” Web 服务的目的是要支持将出现的各种标准(请参见此指南稍后的 参考资料 部分以获取相关链接)。但 Axis 很难这样做,因为它没有足够的干净的扩展层。通过利用新的 Axis2,此问题将得以克服,所以当前 Axis2 计划实现新的 Web 服务协议,启用 WS-Security、WS-Addressing 和 WS-ReliableMessaging,然后从此进行扩展。 事实上,Axis2 甚至尚未发行一个完整的版本;但它功能性特别强,并且在黄金时段一定能够随时可用。而令人惊讶的是 Apache 团队仅用五个月的时间就从 milestone 1 版升级到了非常有用的版本 0.9。 因此,对于 Axis2 中的所有改进,有些开发人员可能想知道它们的区别,更为重要的是了解需要做哪些改动以将其 Axis Web 服务移植到 Axis2。本文仅介绍在 Geronimo 上进行部署和测试的方法,并假定以前不了解 Axis 和 Axis2;另外,本文假定最初的 Axis Web 服务是使用 Axis WSDL2Java 工具在现有的 WSDL 上构建的(将通过 Axis2 中的 xmlbeans 构建数据绑定)。 若要开始本文中介绍的移植,首先需要下载和安装必要的技术。 行动起来 对于本文,需要以下产品和技术:
将每个 .jar、.war、.zip 或 tar.gz 文件解压到不同的目录,现在就可以启动 Apache Geronimo 了。请转到 <geronimo-install-dir>/bin,并输入以下内容以启动 Geronimo: java -jar server.jar Geronimo 将加载并等待您部署本文后面提及的 Web 服务。现在让我们将话题转到 Axis2 相对于 Axis 的提高上。
提高 Axis2 有几个优于 Axis 的改进,它们可以帮助加快响应速度以及提高可扩展性和模块化。但遗憾的是,向后兼容性是个问题。作为一个产品过程,人们需要它具有向后兼容性,以便不让以前的产品失效;但是,由于 Axis 和 Axis2 是在不同的体系结构上开发的,所以 API 可能很难支持。Axis2 支持 Axis 数据绑定(ADB),这一点与 Axis 非常相似,但它仍然受限,并且不如 Axis2 的默认数据绑定的支持功能强。 而利用模块化的体系结构,在整篇文章中您可以轻松地比较使用 WSDL2Java 工具时二者之间的模块性。事实上,Axis2 WSDL2Java 工具可生成数百个文件,如果您实现其他的 Web 服务标准,文件可能会更多,因为 XSD 模式中的每个元素和复杂类型都有其自己的类和实现类。这将大大提高对 Axis2 的 xmlbeans 数据的绑定支持 —— 每个消息和 SOAP 文档对象都将获得其自己的对象。 另一个巨大改进是部署。部署 Axis Web 服务非常繁琐,并需要深入挖掘才能对每种东西进行分类,同时 Web Services Deployment Descriptor(.wsdd)文件是最受支持的方法。不过,使用 Axis 则涉及到构建 Axis 存档文件(.aar),后者可以通过使用 Axis2 Web 接口轻松地部署和重新部署。 您将在本文的其他部分看到每一处改进。下面我们看一下对 Web 服务的简介。
Web 服务 本文使用可以在 下载 部分看到的在 WSDL 中定义的简单 Web 服务。它具有单个操作 —— 清单 1. Ask 和 AskResponse
WSDL 文件的完整细节将留作练习。通过 参考资料 部分中的链接可以了解到有关 WSDL 的更多知识。 Axis Web 服务 为了获得完整性,现在可以构建 Axis Web 服务并定义其内部。下面的部分将详细叙述迁移到 Axis2 所需的更改和差异。 若要通过 Axis 为 Web 服务创建 Java 文件,必须确保 <axis-install-dir>/lib 目录中的每个 .jar 文件在 CLASSPATH 中。然后输入以下内容以创建 Web 服务: java org.apache.axis.wsdl.WSDL2Java -S true ask.wsdl 这些文件将在 ./com/example/www/ask 目录中创建。若要实现 Axis Web 服务,只需要修改下面将要讲述的一个文件。 端口绑定实现 Axis 实现 Web 服务比其继任者(Axis2)简单。Axis 只处理基本的原始对象,如 在 Axis 中,AskPortBindingImpl.java 文件是实现 Web 服务的地方。请在 ./com/example/www/ask/AskPortBindingImpl.java 中查找并定义它,如 清单 2 所示。 清单 2. 在 Axis 中处理 Ask 操作
该类包含在 ask.wsdl 文件中定义的单个 Java 客户机 在此,需要用 Java 语言定义与 Axis Web 服务通信的命令行客户机。在 AskPortBindingImpl.java 文件所在的目录中定义文件 AskServiceTestCase.java,如 清单 3 所示。 清单 3. Axis 客户机存根
客户机存根对象将通过使用 在 Geronimo 上部署和运行客户机 现在可以设置 Axis 安装并将 Axis Web 服务打包,从而在 Geronimo 上部署。进入 Axis Web 服务所在的目录并输入以下内容,从而创建包含 Web 服务部署描述符的 server-config.wsdd 文件: (对于整个这一节,要确保 <axis-install-dir>/lib 中的 .jar 文件在 CLASSPATH 中。) cd com/example/www/ask 这将创建 server-config.wsdd 文件。请将此文件复制到 WEB-INF 目录: cp server-config.wsdd <axis-install-dir>/webapps/axis/WEB-INF 现在向上经过四个目录进入 Axis Web 服务的根部,并编译 Java 文件。然后将这些文件复制到 Axis WEB-INF/classes 目录: javac com/example/www/ask/*.java 现在与 Web 服务一起打包(WAR)并部署 Axis: cd <axis-install-dir>/webapps/axis Geronimo Hot Deployer 现在应该会发现和部署 Axis。一旦部署,就运行 java com.example.www.ask.AskServiceTestCase 应该会看到下面这样的服务器输出: QUESTION ASKED: I have a hole in my bucket, dear Liza, with what should I fix it? 还应该会看到来自客户机的以下内容: ANSWER RECEIVED: Why ask me, Georgy, I don't know anything!!! 这些就是进行部署的许多步骤!接下来看看部署 Axis2 Web 服务会有多么容易。
比较和对照 Axis2 注意,只要看一下本节中的骨架和客户机,就会发现 Axis2 非常与众不同,本节把它与 Axis 进行对比。 甚至对 WSDL2Java 工具的使用也很不一般。确保 <axis2-install-dir>/WEB-INF/lib 目录中的所有 .jar 文件都在 CLASSPATH 中,然后通过输入以下内容创建 Axis2 Java 类: java org.apache.axis2.wsdl.WSDL2Java -uri ask.wsdl -ss -sd 现在输入以下内容来创建客户机存根: java org.apache.axis2.wsdl.WSDL2Java -uri ask.wsdl -sd 骨架和客户机存根文件将在 ./src/com/ibm/axis2/ask 目录中创建, 服务器骨架 在 Axis2 中,可以定义服务器骨架类本身,而不是实现对象。另外,可以在下面的代码中看到这个体系结构的模块性是多么强。请查找和定义在 ./src/com/ibm/axis2/ask/AskPortTypeSkeleton.java 中发现的文件,如 清单 4 所示。 清单 4. 定义服务器骨架
注意,Ask 操作的返回类型和传入对象分别是 用粗体字显示的最后七行创建了响应。首先, 如上例所示,使用 Axis2 更模块化的体系结构,向 Axis2 添加更多特性和功能的过程更容易编码和实现。 Java 客户机 调用 Web 服务也很不同一般,这反映了 Axis2 的改进和提高。请在 ./src/com/ibm/axis2/ask/Client.java 中创建一个文件并如 清单 5 所示定义它。 清单 5. Axis2 客户机代码
需要引起注意的代码用粗体显示。第一行通过接受服务端点或该服务的 URL 创建客户机存根。然后将调用 到目前为止,您在 Axis 和 Axis2 中看到的 Web 服务都是同步的,它们也被称为阻塞的 Web 服务调用。Axis2 通过非阻塞调用提供了更多的异步支持,可以将它们放在 在 Geronimo 上部署和运行客户机 与 Axis 相比,部署 Axis2 Web 服务更为轻松并且不需要太多的步骤。同样,在本节中要确保 <axis2-install-dir>/WEB-INF/lib 目录中的所有 .jar 文件都在 CLASSPATH 中。现在部署前面下载到 Geronimo 上的 axis2.war: cp axis2.war <geronimo-install-dir>/deploy 通过输入以下内容编译构成 Axis2 Web 服务的所有 Java 文件: ant jar.server AskService.aar 文件在 ./build/lib/AskService.aar 中创建,此文件随时可通过其 Web 接口部署在 Axis2 上。请打开浏览器,进入 http://localhost:8080/axis2/Login.jsp。 现在分别使用 admin 和 axis2 作为用户名和密码登录(参见 图 1)。 图 1. 登录到 Axis2 接下来,将浏览器指向 http://localhost:8080/axis2/upload.jsp。 单击 browse 按钮,查找刚才创建的 Ask.aar 文件,然后单击 Open。现在单击 upload(参见 图 2)。几秒之后,将完全部署您的 Web 服务。 图 2. 上载 Axis2 Web 服务 既然已经部署了 Web 服务,就可以通过运行客户机进行测试。为此,必须将 AskService.aar 文件和 XBeans-packaged.jar 文件(都在 ./build/lib 目录中)添加到 CLASSPATH 中。在完成此操作后,请输入以下内容来运行客户机: java com.ibm.axis2.ask.Client 应该会看到分别来自服务器和控制台的关于 Liza 和 Georgy 的输出消息,这些消息与在运行 Axis Web 服务的客户端时看到的输出消息相同。 注意,在 Axis2 中部署比在 Axis 中更简单,这都要归功于方便的 build.xml 文件、Axis Archive 文件和功能性强的 Web 接口!
结束语 现在您已经使用 Apache Geronimo 成功地将 Axis Web 服务移植到了 Axis2 中。已经看到了 Axis2 对 Axis 进行了哪些改进。请查阅 参考资料 部分,了解关于这种重要的新工具 Axis2 的更多知识。
下载
参考资料 学习
获得产品和技术
讨论
关于作者
|