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

开发 后端
在现实应用中有些时候会有比较大的数据对象需要传输,或者在一个比较慢的网络环境下发布调用web service,此时可以通过压缩数据流的方式来减小数据包的大小,从而提高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;  
    }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

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);  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

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;  
    }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

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());  
    }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

5. 运行此unit test,可以在日志中看到数据包前后大小和内容。

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

【系列文章】

  1. Apache CXF实战之五:压缩Web Service数据
  2. Apache CXF实战之四:构建RESTful Web Service
  3. Apache CXF实战之三:传输Java对象
  4. Apache CXF实战之二:集成Sping与Web容器
  5. Apache CXF实战之一:Hello World Web Service
责任编辑:林师授 来源: kongxx的博客
相关推荐

2012-05-03 11:43:32

ApacheCXFRESTful

2012-05-07 14:15:41

ApacheCXFJava

2012-05-07 14:08:20

ApacheCXFJava

2012-05-03 11:21:58

ApacheCXFJava

2012-05-03 11:30:04

ApacheCXFJava

2012-05-03 11:35:56

ApacheCXFJava

2012-02-22 22:56:19

开源Apache

2022-10-24 00:26:51

大数据Hadoop存储层

2012-05-03 10:24:02

ApacheMINAJava

2012-05-03 10:55:51

ApacheMINAJava

2012-02-15 10:40:37

JavaJava Socket

2009-06-22 10:14:00

J2EE web se

2009-10-21 13:43:04

Linux压缩方法

2011-04-27 10:57:29

高性能web开发

2023-02-26 00:12:10

Hadoop数据湖存储

2019-05-21 14:33:01

2011-04-22 09:54:37

CSSjavascript

2009-06-22 13:33:00

Apache CXF2JAX-WS2.0

2009-08-20 15:38:50

C#建立Web Ser

2009-12-08 17:48:28

Web Service
点赞
收藏

51CTO技术栈公众号