快速业务通道

WebService大讲堂之Axis2(8):异步调用WebService - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04

WebService大讲堂之Axis2(8):异步调用WebService

时间:2011-08-13 BlogJava 哈佛校训

上一篇:WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService

在前面几篇文章中都是使用同步方式来调用WebService。也就是说,如果被调用的WebService方法长 时间不返回,客户端将一直被阻塞,直到该方法返回为止。使用同步方法来调用WebService虽然很直观, 但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这 样用户是无法忍受的。

当然,我们很容易就可以想到解决问题的方法,这就是多线程。解决问题的基本方法是将访问 WebService的任务交由一个或多个线程来完成,而主线程并不负责访问WebService。这样即使被访问的 WebService方法长时间不返回,客户端仍然可以做其他的工作。我们可以管这种通过多线程访问 WebService的方式称为异步访问。

虽然直接使用多线程可以很好地解决这个问题,但比较麻烦。幸好Axis2的客户端提供了异步访问 WebService的功能。

RPCServiceClient类提供了一个invokeNonBlocking方法可以通过异步的方式来访问WebService。下面 先来建立一个WebService。

MyService是一个WebService类,代码如下:

package service;
public class MyService
{
    public String getName()
    {
        try
        {
            System.out.println("getName方法正在执行");
            //  延迟5秒
            Thread.sleep(5000);
        }
        catch (Exception e)
        {
        }
        return "火星";
    }
}

WebService大讲堂之Axis2(8):异步调用WebService(2)

时间:2011-08-13 BlogJava 哈佛校训

为了模拟需要一定时间才返回的WebService方法,在getName方法中使用了sleep方法来延迟5秒。

下面是MyService类的配置代码:

<!--  services.xml  -->
<service name="myService">
    <description>
        异步调用演示
    </description>
    <parameter name="ServiceClass">
        service.MyService
    </parameter>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </messageReceivers>
</service>

从上面的配置代码可以看出,MyService的配置方式与前几章的WebService的配置方式完全一样,也就 是说,MyService只是一个普通的WebService。

下面是异步调用MyService的Java客户端代码:

package client;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class RPCAsyncClient
{
    public static void main(String[] args) throws Exception
    {
        RPCServiceClient serviceClient = new RPCServiceClient();
        Options options = serviceClient.getOptions();
        EndpointReference targetEPR = new EndpointReference(
                "http://localhost:8080/axis2/services/myService");
        options.setTo(targetEPR);
        Object[] opAddEntryArgs = new Object[]{};
        QName opAddEntry = new QName("http://service", "getName");
        serviceClie

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号