码迷,mamicode.com
首页 > 其他好文 > 详细

CXF简单示例(二)之异步调用

时间:2015-08-12 23:38:07      阅读:438      评论:0      收藏:0      [点我收藏+]

标签: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

版权声明:本文为博主原创文章,未经博主允许不得转载。

CXF简单示例(二)之异步调用

标签:cxf

原文地址:http://blog.csdn.net/u013769320/article/details/47454133

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!