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>
  1. 打開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到工程下面:
    這裏寫圖片描述
  2. 下面開始編寫客戶端的測試代碼了
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章