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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值