1. 程式人生 > >Apache CXF實戰之五 壓縮Web Service資料

Apache CXF實戰之五 壓縮Web Service資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

本文連結: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;@WebServicepublic 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,可以在日誌中看到資料包前後大小和內容。







           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述