异步,说到异步需要首先将以下同步。同步就是代码按照顺序执行,当前面的代码的请求没有正常返回结果的情况下,后面的代码是不能运行。
而异步正好和这点不同,异步是代码运行后,不管当前的请求是否返回结果,后面的代码都会继续运行。
关于异步在此就不再赘述了,有兴趣的可以去网上查查这方面的资料。
1、 编写服务器端的代码。
package com.hoo.service;/*** <b>function:</b>异步WebService服务器端代码* @author hoojo* @createDate 2011-3-14 上午08:16:59* @file AsynchronousService.java* @package com.hoo.service* @project Axis2WebService* @blog http://blog.csdn.net/IBM_hoojo* @email hoojo_@126.com* @version 1.0*/ public class AsynchronousService {public String execute() {System.out.println("正在执行此代码……");//延迟5秒后,返回结果try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}return "完成";} }
2、 services.xml文件,创建aar文件,然后复制aar文件到[tomcat-home]/webapps/axis2/WEB-INF/services目录下
services.xml
<service name="AsyncService"><description>AsyncService</description><parameter name="ServiceClass">com.hoo.service.AsynchronousService</parameter><messageReceivers><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /></messageReceivers> </service>
3、 编写客户端测试代码
package com.hoo.service;import java.io.IOException; import javax.xml.namespace.QName; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.async.AxisCallback; import org.apache.axis2.context.MessageContext; import org.apache.axis2.rpc.client.RPCServiceClient;/*** <b>function:</b>异步WebService客户端代码* @author hoojo* @createDate 2011-3-14 上午09:00:03* @file AsynchronousServiceClient.java* @package com.hoo.service* @project Axis2WebService* @blog http://blog.csdn.net/IBM_hoojo* @email hoojo_@126.com* @version 1.0*/ public class AsynchronousServiceClient {public static void main(String[] args) throws IOException {String target = "http://localhost:8080/axis2/services/AsyncService?wsdl";RPCServiceClient client = new RPCServiceClient();Options options = client.getOptions();options.setManageSession(true);EndpointReference epr = new EndpointReference(target);options.setTo(epr);QName qname = new QName("http://service.hoo.com", "execute");//指定调用的方法和传递参数数据,及设置返回值的类型client.invokeNonBlocking(qname, new Object[] {}, new AxisCallback() {public void onMessage(MessageContext ctx) {System.out.println(ctx.getEnvelope());System.out.println("Message:" + ctx.getEnvelope().getFirstElement()
.getFirstElement().getFirstElement().getText());}public void onFault(MessageContext ctx) {}public void onError(Exception ex) {}public void onComplete() {}});System.out.println("异步WebService");//阻止程序退出System.in.read();} }
上面是异步调用WebService的代码,调用的方法是client.invokeNonBlocking,这个方法有三个参数,参数一是执行的方法签名,
参数二是执行该方法的参数,参数三是异步回调,这里隐式实现AxiaCallback接口 注意的是运行程序的时候要用Debug方式运行。