在實際使用中,客戶端在調用服務時,並不能及時得到響應,比如調用的服務本身是一個耗時費事的活,服務器破死命的跑,也只能在一分鐘後才能夠返回結果,這時候如果是同步的情況,那麼客戶端就必須在這裏到等上一分鐘,啥事不幹。這肯定是不能容忍的,光喫飯不幹活,再有這麼好的事,請告訴我!
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>
- 打開cmd(需要配置好jdk環境變量),進入你從官網上下載的文件的bin目錄,我這裏是C:\Users\huaixin\Desktop\apache-cxf-3.1.2\bin
輸入如下指令:wsdl2java -b E:\workspace\WebservicePractice\wsdl.xml http://localhost:8080/TicketExtractIntegrationService/extractTicketStatusService?wsdl
指令格式: wsdl2java -b (wsdl.xml文件絕對路徑) (服務的wsdl路徑,此時服務需打開)
可以看到在bin目錄下生成了com開頭的目錄,我們將它copy到工程下面:
- 下面開始編寫客戶端的測試代碼了
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