标签:cxf
在实际使用中,客户端在调用服务时,并不能及时得到响应,比如调用的服务本身是一个耗时费事的活,服务器破死命的跑,也只能在一分钟后才能够返回结果,这时候如果是同步的情况,那么客户端就必须在这里到等上一分钟,啥事不干。这肯定是不能容忍的,光吃饭不干活,再有这么好的事,请告诉我!
OK,所以我们需要异步调用。
在这里,先介绍CXF提供的一个工具:WSDL2Java。
我们可以方便的利用它来生成相应的客户端接口,配置什么的脏活累活它都给我们干了,而我们只需要这样直接用就行了。
1. 获得服务的WSDL路径,这里我接着上一篇博客:http://localhost:8080/helloWorld?wsdl
2. 在下载的CXF官方文件目录下新建文本文件,内容如下
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
<!-- 这里的路径是WSDL路径-->
wsdlLocation="http://localhost:8080/TicketExtractIntegrationService/extractTicketStatusService?wsdl"
xmlns="http://java.sun.com/xml/ns/jaxws">
<bindings node="wsdl:definitions">
<enableAsyncMapping>true</enableAsyncMapping>
</bindings>
</bindings>
package com.test;
import helloworld.HelloWorldService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Response;
import com.smart.service.SayHelloResponse;
public class Test {
public static void main(String args[]) throws Exception {
// 直接创建即可
HelloWorldService server = new HelloWorldService();
// 创建远程服务接口
com.smart.service.HelloWorldService hw = server.getHelloWorldPort();
// 异步调用
Future<?> future = hw.sayHelloAsync(new AsyncHandler<SayHelloResponse>() {
// 在服务器返回后,自动回调该函数
@Override
public void handleResponse(Response<SayHelloResponse> arg0) {
try {
SayHelloResponse helloResponse = arg0.get();
System.out.println(helloResponse.getReturn());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//异步调用
Response<SayHelloResponse> response = hw.sayHelloAsync();
//阻塞等待服务调用返回结果
Object object = future.get();
System.out.println(object);
SayHelloResponse helloResponse = response.get();
System.out.println(helloResponse.getReturn());
}
}
Ok,运行即可。
源码地址:https://github.com/Zhang-Jin-Hua/CXFAysyncTest
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:cxf
原文地址:http://blog.csdn.net/u013769320/article/details/47454133