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

来源:互联网 发布:mac带圈圈的数字怎么打 编辑:程序博客网 时间:2024/05/29 16:33

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

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

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.cxfstudy.compress; 
  2.  
  3.  
  4. public class BigData { 
  5.      
  6.     private String name; 
  7.      
  8.     private String data; 
  9.      
  10.     public BigData() { 
  11.          
  12.     } 
  13.      
  14.     public BigData(String name, int size) { 
  15.         this.name = name; 
  16.         StringBuilder sb = new StringBuilder(); 
  17.         for (int i =0; i < size; i++) { 
  18.             sb.append("0"); 
  19.         } 
  20.         this.data = sb.toString(); 
  21.     } 
  22.  
  23.     public String getName() { 
  24.         return name; 
  25.     } 
  26.  
  27.     public void setName(String name) { 
  28.         this.name = name; 
  29.     } 
  30.  
  31.     public String getData() { 
  32.         return data; 
  33.     } 
  34.  
  35.     public void setData(String data) { 
  36.         this.data = data; 
  37.     } 
2. Web Service接口类,和普通的接口定义没有什么区别。

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.cxfstudy.compress; 
  2.  
  3. import javax.jws.WebMethod; 
  4. import javax.jws.WebParam; 
  5. import javax.jws.WebResult; 
  6. import javax.jws.WebService; 
  7.  
  8. @WebService 
  9. public interface BigDataService { 
  10.      
  11.     @WebMethod 
  12.     @WebResult BigData getBigData(@WebParam String name,@WebParam int size); 
3. Web Service实现类

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

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.cxfstudy.compress; 
  2.  
  3. import org.apache.cxf.endpoint.Client; 
  4. import org.apache.cxf.endpoint.Endpoint; 
  5. import org.apache.cxf.frontend.ClientProxy; 
  6. import org.apache.cxf.interceptor.LoggingInInterceptor; 
  7. import org.apache.cxf.interceptor.LoggingOutInterceptor; 
  8. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 
  9. import org.apache.cxf.jaxws.JaxWsServerFactoryBean; 
  10. import org.apache.cxf.transport.http.gzip.GZIPInInterceptor; 
  11. import org.apache.cxf.transport.http.gzip.GZIPOutInterceptor; 
  12. import org.junit.Assert; 
  13. import org.junit.BeforeClass; 
  14. import org.junit.Test; 
  15.  
  16. public class BigDataServiceTest { 
  17.  
  18.     private staticfinal String address = "http://localhost:9000/ws/compress/bigDataService"
  19.      
  20.     @BeforeClass 
  21.     public staticvoid setUpBeforeClass() throws Exception { 
  22.         JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); 
  23.         factoryBean.getInInterceptors().add(new LoggingInInterceptor()); 
  24.         factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); 
  25.         factoryBean.getInInterceptors().add(new GZIPInInterceptor()); 
  26.         factoryBean.getOutInterceptors().add(new GZIPOutInterceptor()); 
  27.          
  28.         factoryBean.setServiceClass(BigDataServiceImpl.class); 
  29.         factoryBean.setAddress(address); 
  30.         factoryBean.create(); 
  31.     } 
  32.  
  33.     @Test 
  34.     public void testGetBigData() { 
  35.         JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean(); 
  36.         factoryBean.setAddress(address); 
  37.         factoryBean.setServiceClass(BigDataService.class); 
  38.         Object obj = factoryBean.create(); 
  39.          
  40.         Client client = ClientProxy.getClient(obj); 
  41.         Endpoint endpoint = client.getEndpoint(); 
  42.         endpoint.getInInterceptors().add(new GZIPInInterceptor()); 
  43.         endpoint.getOutInterceptors().add(new GZIPOutInterceptor()); 
  44.          
  45.         BigDataService service = (BigDataService) obj; 
  46.         Assert.assertNotNull(service); 
  47.          
  48.         String name = "my big data"
  49.         int size = 1024 * 1024 *10
  50.          
  51.         long start = System.currentTimeMillis(); 
  52.         BigData bigData = service.getBigData(name, size); 
  53.         long stop = System.currentTimeMillis(); 
  54.         System.out.println("Time: " + (stop - start)); 
  55.          
  56.         Assert.assertNotNull(bigData); 
  57.         Assert.assertEquals(name, bigData.getName()); 
  58.         Assert.assertEquals(size, bigData.getData().length()); 
  59.     } 
5. 运行此unit test,可以在日志中看到数据包前后大小和内容。