关闭

使用 Apache Geronimo 将 Apache Axis 应用程序移植到 Axis2

标签: apachewebjavaexceptionstring应用服务器
705人阅读 评论(0) 收藏 举报
分类:
 
developerWorks 中国  >  Open source | Java technology | SOA and Web services  >

使用 Apache Geronimo 将 Apache Axis 应用程序移植到 Axis2

developerWorks
文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送



级别: 中级

Tyler Anderson (tyleranderson5@yahoo.com), 自由作家, 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 服务。它具有单个操作 —— Ask,这个操作带有单个 String 参数 —— question,并返回单个 String 作为响应 answerAsk 的 XSD 和 Web 服务的 AskResponse 元素显示在 清单 1 中。


清单 1. Ask 和 AskResponse
      <xsd:element name="Ask">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="1" maxOccurs="1"
                         name="question" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="AskResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="1" maxOccurs="1" 
                         name="answer" type="xsd:string" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>

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 只处理基本的原始对象,如 Stringintfloat 等。

在 Axis 中,AskPortBindingImpl.java 文件是实现 Web 服务的地方。请在 ./com/example/www/ask/AskPortBindingImpl.java 中查找并定义它,如 清单 2 所示。


清单 2. 在 Axis 中处理 Ask 操作
package com.example.www.ask;

public class AskPortBindingImpl implements
             com.example.www.ask.AskPortType{
    public java.lang.String ask(java.lang.String question)
            throws java.rmi.RemoteException {
        System.out.println("QUESTION ASKED: " + question);
        return "Why ask me, Georgy, I don't know anything!!!";
    }
}

该类包含在 ask.wsdl 文件中定义的单个 Ask 操作,它接受问题 String,并返回回答 String。接下来需要定义与 Axis Web 服务通信的客户机存根。

Java 客户机

在此,需要用 Java 语言定义与 Axis Web 服务通信的命令行客户机。在 AskPortBindingImpl.java 文件所在的目录中定义文件 AskServiceTestCase.java,如 清单 3 所示。


清单 3. Axis 客户机存根
package com.example.www.ask;

public class AskServiceTestCase  {

    public static void main(String args[]) throws Exception {
        com.example.www.ask.AskPortBindingStub binding = null;
        try {
            binding = (com.example.www.ask.AskPortBindingStub)
                          new com.example.www.ask.
                                 AskServiceLocator().getAskPort();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        // Test operation
        java.lang.String answer = null;
        answer = binding.ask(new java.lang.String("I have a hole in"+
                " my bucket, dear Liza, with what should I fix it?"));
	  System.out.println("ANSWER RECEIVED: " + answer);
    }

}

客户机存根对象将通过使用 AskServiceLocator 对象在 try 语句中创建,后者为在 WSDL 中定义的服务定义了服务地址和端口。最后两行将调用 Ask 操作并传递问题。将接收回答并显示给用户。

在 Geronimo 上部署和运行客户机

现在可以设置 Axis 安装并将 Axis Web 服务打包,从而在 Geronimo 上部署。进入 Axis Web 服务所在的目录并输入以下内容,从而创建包含 Web 服务部署描述符的 server-config.wsdd 文件:

(对于整个这一节,要确保 <axis-install-dir>/lib 中的 .jar 文件在 CLASSPATH 中。)

cd com/example/www/ask
java org.apache.axis.utils.Admin server com/example/www/ask/deploy.wsdd

这将创建 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
cp -r com <axis-install-dir>/webapps/axis/WEB-INF/classes

现在与 Web 服务一起打包(WAR)并部署 Axis:

cd <axis-install-dir>/webapps/axis
jar -cvf axis.war *
mv axis.war <geronimo-install-dir>/deploy

Geronimo Hot Deployer 现在应该会发现和部署 Axis。一旦部署,就运行 AskServiceTestCase 类中的客户机代码:

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
-p com.ibm.axis2.ask -d xmlbeans

现在输入以下内容来创建客户机存根:

java org.apache.axis2.wsdl.WSDL2Java -uri ask.wsdl -sd
-p com.ibm.axis2.ask -d xmlbeans

骨架和客户机存根文件将在 ./src/com/ibm/axis2/ask 目录中创建,AskDocumentAskResonseDocument 类在 ./src/com/example/www/ask/xsd 目录中创建。几个 xmlsoap 类在 ./src/org/xmlsoap/schemas/soap/encoding 中创建。因此您可能已经看到,尽管 Axis2 在开始时可能看起来更加复杂,有太多要创建的类,但是 Axis2 具有更模块化的体系结构,并使用此体系结构更加高效。

服务器骨架

在 Axis2 中,可以定义服务器骨架类本身,而不是实现对象。另外,可以在下面的代码中看到这个体系结构的模块性是多么强。请查找和定义在 ./src/com/ibm/axis2/ask/AskPortTypeSkeleton.java 中发现的文件,如 清单 4 所示。


清单 4. 定义服务器骨架
package com.ibm.axis2.ask;

public class AskPortTypeSkeleton {
    public com.example.www.ask.xsd.AskResponseDocument Ask
        (com.example.www.ask.xsd.AskDocument param0 ){
        System.out.println("QUESTION ASKED: " +
                           param0.getAsk().getQuestion());

        com.example.www.ask.xsd.AskResponseDocument res =
            com.example.www.ask.xsd.AskResponseDocument.
            Factory.newInstance();
        com.example.www.ask.xsd.AskResponseDocument.AskResponse res2 =
            res.addNewAskResponse();
        res2.setAnswer("Why ask me, Georgy, I don't know anything!!!");
        return res;
    }
}

注意,Ask 操作的返回类型和传入对象分别是 AskResponseDocumentAskDocument,而不仅仅是简单的 String 对象。像 Axis 一样,问题还是 String 对象,可以通过首先获得传入的 AskDocument 对象中的 Ask 对象并调用 Ask 对象的 getQuestion() 方法来获得问题。

用粗体字显示的最后七行创建了响应。首先,AskResponseDocument 对象通过在 AskResponseDocument 中创建的 AskResponse 对象得以实例化。最后,将通过调用 AskResponse 对象的 setAnswer() 方法设置回答。注意,AskResponseDocument 将作为响应返回到进行调用的 SOAP 客户端。回答和 AskResponse 对象将封装在 AskResponseDocument 对象中。

如上例所示,使用 Axis2 更模块化的体系结构,向 Axis2 添加更多特性和功能的过程更容易编码和实现。

Java 客户机

调用 Web 服务也很不同一般,这反映了 Axis2 的改进和提高。请在 ./src/com/ibm/axis2/ask/Client.java 中创建一个文件并如 清单 5 所示定义它。


清单 5. Axis2 客户机代码
package com.ibm.axis2.ask;

import com.example.www.ask.xsd.*;

public class Client{
    public static void main(java.lang.String args[]){
        try{
            AskPortTypeStub stub = new AskPortTypeStub(null,
                "http://localhost:8080/axis2/services/AskService");
            ask(stub);
        } catch(Exception e){
            e.printStackTrace();
        }
    }

    /* Ask */
    public static boolean ask(AskPortTypeStub stub){
        try{
            AskDocument reqDoc = AskDocument.Factory.newInstance();
            AskDocument.Ask reqDoc2 = reqDoc.addNewAsk();
            reqDoc2.setQuestion("I have a hole in"+
                " my bucket, dear Liza, with what should I fix it?");

            AskResponseDocument resDoc = stub.Ask(reqDoc);
            System.out.println("ANSWER RECEIVED: " +
                               resDoc.getAskResponse().getAnswer());
            return true;
        } catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }
}

需要引起注意的代码用粗体显示。第一行通过接受服务端点或该服务的 URL 创建客户机存根。然后将调用 ask() 方法,后者创建 Ask 请求,这与 AskResponseDocument清单 4 中的创建方法类似。该请求将通过调用 stub.Ask() 发送,并将把响应放在 resDoc 中。然后可以通过调用 resDoc.getAskResponse().getAnswer() 来获得接收到的回答,这类似于在 清单 4 的骨架代码的开头处获得问题的方法。

到目前为止,您在 Axis 和 Axis2 中看到的 Web 服务都是同步的,它们也被称为阻塞的 Web 服务调用。Axis2 通过非阻塞调用提供了更多的异步支持,可以将它们放在 AskPortTypeCallbackHandler 类中,并在上述客户端代码中调用 stub.startAsk() ,而不是 stub.Ask()

在 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
登录到 Axis2

接下来,将浏览器指向 http://localhost:8080/axis2/upload.jsp。

单击 browse 按钮,查找刚才创建的 Ask.aar 文件,然后单击 Open。现在单击 upload(参见 图 2)。几秒之后,将完全部署您的 Web 服务。


图 2. 上载 Axis2 Web 服务
上载 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 的更多知识。






回页首


下载

描述 名字 大小 下载方法
Sample code axis2source.zip 10KB HTTP
关于下载方法的信息


参考资料

学习

获得产品和技术

讨论


关于作者

 

Tyler Anderson 于 2004 年毕业于 Brigham Young 大学的计算机科学专业,并于 2005 年 12 月获取了该大学的计算机工程硕士学位。目前是位于 Beaverton, Ore 的 Stexar Corp. 的工程师。


 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:267737次
    • 积分:3186
    • 等级:
    • 排名:第10702名
    • 原创:34篇
    • 转载:84篇
    • 译文:1篇
    • 评论:46条
    最新评论
    工作流