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

23 篇文章 1 订阅

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

分类: Java WebService CXF 3905人阅读 评论(2) 收藏 举报

本文链接: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大小的字符串。

  1. package com.googlecode.garbagecan.cxfstudy.compress;
  2. public class BigData {
  3. private String name;
  4. private String data;
  5. public BigData() {
  6. }
  7. public BigData(String name, int size) {
  8. this.name = name;
  9. StringBuilder sb = new StringBuilder();
  10. for (int i = 0; i < size; i++) {
  11. sb.append("0");
  12. }
  13. this.data = sb.toString();
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public String getData() {
  22. return data;
  23. }
  24. public void setData(String data) {
  25. this.data = data;
  26. }
  27. }
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接口类,和普通的接口定义没有什么区别。

  1. package com.googlecode.garbagecan.cxfstudy.compress;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebParam;
  4. import javax.jws.WebResult;
  5. import javax.jws.WebService;
  6. @WebService
  7. public interface BigDataService {
  8. @WebMethod
  9. @WebResult BigData getBigData(@WebParam String name, @WebParam int size);
  10. }
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实现类

  1. package com.googlecode.garbagecan.cxfstudy.compress;
  2. public class BigDataServiceImpl implements BigDataService {
  3. public BigData getBigData(String name, int size) {
  4. BigData bigData = new BigData(name, size);
  5. return bigData;
  6. }
  7. }
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来压缩和解压缩数据包。

  1. package com.googlecode.garbagecan.cxfstudy.compress;
  2. import org.apache.cxf.endpoint.Client;
  3. import org.apache.cxf.endpoint.Endpoint;
  4. import org.apache.cxf.frontend.ClientProxy;
  5. import org.apache.cxf.interceptor.LoggingInInterceptor;
  6. import org.apache.cxf.interceptor.LoggingOutInterceptor;
  7. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  8. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  9. import org.apache.cxf.transport.http.gzip.GZIPInInterceptor;
  10. import org.apache.cxf.transport.http.gzip.GZIPOutInterceptor;
  11. import org.junit.Assert;
  12. import org.junit.BeforeClass;
  13. import org.junit.Test;
  14. public class BigDataServiceTest {
  15. private static final String address = "http://localhost:9000/ws/compress/bigDataService";
  16. @BeforeClass
  17. public static void setUpBeforeClass() throws Exception {
  18. JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
  19. factoryBean.getInInterceptors().add(new LoggingInInterceptor());
  20. factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
  21. factoryBean.getInInterceptors().add(new GZIPInInterceptor());
  22. factoryBean.getOutInterceptors().add(new GZIPOutInterceptor());
  23. factoryBean.setServiceClass(BigDataServiceImpl.class);
  24. factoryBean.setAddress(address);
  25. factoryBean.create();
  26. }
  27. @Test
  28. public void testGetBigData() {
  29. JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
  30. factoryBean.setAddress(address);
  31. factoryBean.setServiceClass(BigDataService.class);
  32. Object obj = factoryBean.create();
  33. Client client = ClientProxy.getClient(obj);
  34. Endpoint endpoint = client.getEndpoint();
  35. endpoint.getInInterceptors().add(new GZIPInInterceptor());
  36. endpoint.getOutInterceptors().add(new GZIPOutInterceptor());
  37. BigDataService service = (BigDataService) obj;
  38. Assert.assertNotNull(service);
  39. String name = "my big data";
  40. int size = 1024 * 1024 * 10;
  41. long start = System.currentTimeMillis();
  42. BigData bigData = service.getBigData(name, size);
  43. long stop = System.currentTimeMillis();
  44. System.out.println("Time: " + (stop - start));
  45. Assert.assertNotNull(bigData);
  46. Assert.assertEquals(name, bigData.getName());
  47. Assert.assertEquals(size, bigData.getData().length());
  48. }
  49. }
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,可以在日志中看到数据包前后大小和内容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值