微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

八、 异步调用WebService

异步,说到异步需要首先将以下同步。同步就是代码按照顺序执行,当前面的代码的请求没有正常返回结果的情况下,后面的代码是不能运行。

而异步正好和这点不同,异步是代码运行后,不管当前的请求是否返回结果,后面的代码都会继续运行。

关于异步在此就不再赘述了,有兴趣的可以去网上查查这方面的资料。

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 [email protected]
 * @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 [email protected]
 * @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方式运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐