文档章节

Apache CXF实战之五 压缩Web Service数据

DavidBao
 DavidBao
发布于 2015/05/31 21:45
字数 591
阅读 11
收藏 0

本文链接:http://blog.csdn.net/kongxx/article/details/7530216

Apache CXF实战之一 Hello World Web Service

Apache CXF实战之二 集成Sping与Web容器

Apache CXF实战之三 传输Java对象

Apache CXF实战之四 构建RESTful Web Service

在现实应用中有些时候会有比较大的数据对象需要传输,或者在一个比较慢的网络环境下发布调用web service,此时可以通过压缩数据流的方式来减小数据包的大小,从而提高web service的性能。下面来看看怎样来做到这一点。

1. 首先模拟一个可以存放大数据的pojo对象,这个对象可以通过构造参数给定的size来模拟一个size大小的字符串。

package com.googlecode.garbagecan.cxfstudy.compress;


public class BigData {
    
    private String name;
    
    private String data;
    
    public BigData() {
        
    }
    
    public BigData(String name, int size) {
        this.name = name;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < size; i++) {
            sb.append("0");
        }
        this.data = sb.toString();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
2. Web Service接口类,和普通的接口定义没有什么区别。

package com.googlecode.garbagecan.cxfstudy.compress;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService
public interface BigDataService {
    
    @WebMethod
    @WebResult BigData getBigData(@WebParam String name, @WebParam int size);
}
3. Web Service实现类

package com.googlecode.garbagecan.cxfstudy.compress;

public class BigDataServiceImpl implements BigDataService {
    public BigData getBigData(String name, int size) {
        BigData bigData = new BigData(name, size);
        return bigData;
    }
}
4. 测试类,这片文章使用了JUnit测试类来做测试。setUpBeforeClass方法用来启动Service, testGetBigData方法用来测试web service。

注意setUpBeforeClass方法中的

    factoryBean.getInInterceptors().add(new GZIPInInterceptor());

    factoryBean.getOutInterceptors().add(new GZIPOutInterceptor());

和testGetBigData方法中的

    endpoint.getInInterceptors().add(new GZIPInInterceptor());

    endpoint.getOutInterceptors().add(new GZIPOutInterceptor());

上面两段代码就是告诉CXF使用压缩Interceptor来压缩和解压缩数据包。

package com.googlecode.garbagecan.cxfstudy.compress;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.transport.http.gzip.GZIPInInterceptor;
import org.apache.cxf.transport.http.gzip.GZIPOutInterceptor;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

public class BigDataServiceTest {

    private static final String address = "http://localhost:9000/ws/compress/bigDataService";
    
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
        factoryBean.getInInterceptors().add(new LoggingInInterceptor());
        factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
        factoryBean.getInInterceptors().add(new GZIPInInterceptor());
        factoryBean.getOutInterceptors().add(new GZIPOutInterceptor());
        
        factoryBean.setServiceClass(BigDataServiceImpl.class);
        factoryBean.setAddress(address);
        factoryBean.create();
    }

    @Test
    public void testGetBigData() {
        JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        factoryBean.setAddress(address);
        factoryBean.setServiceClass(BigDataService.class);
        Object obj = factoryBean.create();
        
        Client client = ClientProxy.getClient(obj);
        Endpoint endpoint = client.getEndpoint();
        endpoint.getInInterceptors().add(new GZIPInInterceptor());
        endpoint.getOutInterceptors().add(new GZIPOutInterceptor());
        
        BigDataService service = (BigDataService) obj;
        Assert.assertNotNull(service);
        
        String name = "my big data";
        int size = 1024 * 1024 * 10;
        
        long start = System.currentTimeMillis();
        BigData bigData = service.getBigData(name, size);
        long stop = System.currentTimeMillis();
        System.out.println("Time: " + (stop - start));
        
        Assert.assertNotNull(bigData);
        Assert.assertEquals(name, bigData.getName());
        Assert.assertEquals(size, bigData.getData().length());
    }
}
5. 运行此unit test,可以在日志中看到数据包前后大小和内容。







本文转载自:http://blog.csdn.net/kongxx/article/details/7530216

DavidBao
粉丝 113
博文 213
码字总数 126729
作品 0
昌平
私信 提问
Apache CXF 3.1.15 发布,开源的 Service 框架

Apache CXF 3.1.15 发布了。Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。 更新内容: Bu...

淡漠悠然
2018/03/14
818
1
Apache CXF 3.0.16 发布,开源的 Service 框架

Apache CXF 3.0.16 发布了。Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面 向服务架构(SOA)业务组件与技术的灵活复用。 主要更新内容...

达尔文
2017/11/30
883
0
apache CXF wsdl2java工具的使用

最近,由于要用到某公司提供的webservice实现的api接口,想到了用cxf的wsdl2java工具来生成客户端程序。(自己写是比较麻烦且费时,so偷懒一下、、) 使用步骤如下: 一、下载apache cxf的包...

Yao淡定
2014/02/21
29.9K
0
Apache CXF 3.0.13 和 3.1.11 发布

Apache CXF 3.0.13 和 3.1.11 发布了,暂未发现具体更新内容。 点此查看 Apache CXF 3.0.13 和 3.1.11 的提交记录。 下载地址 和 发布主页 Apache CXF是一个开源的Service框架,它实现了JCP...

淡漠悠然
2017/04/06
932
3
Apache CXF 2.4.0 发布

Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面 向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使...

红薯
2011/04/19
2.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
63
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部