Apache CXF實戰之五 壓縮Web Service數據

在現實應用中有些時候會有比較大的數據對象需要傳輸,或者在一個比較慢的網絡環境下發布調用web service,此時可以通過壓縮數據流的方式來減小數據包的大小,從而提高web service的性能。下面來看看怎樣來做到這一點。

1. 首先模擬一個可以存放大數據的pojo對象,這個對象可以通過構造參數給定的size來模擬一個size大小的字符串。

  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.     } 
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.  
  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); 
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.  
  3. public class BigDataServiceImpl implements BigDataService { 
  4.     public BigData getBigData(String name, int size) { 
  5.         BigData bigData = new BigData(name, size); 
  6.         return bigData; 
  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.  
  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 static final String address = "http://localhost:9000/ws/compress/bigDataService"
  19.      
  20.     @BeforeClass 
  21.     public static void 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.     } 
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,可以在日誌中看到數據包前後大小和內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章