Apache CXF實戰之五 壓縮Web Service資料
阿新 • • 發佈:2018-11-16
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
本文連結:http://blog.csdn.net/kongxx/article/details/7530216
Apache CXF實戰之一 Hello World Web Service
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,可以在日誌中看到資料包前後大小和內容。