Apache CXF实战之五 压缩Web Service数据
本文链接:http://blog.csdn.net/kongxx/article/details/7530216Apache 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";@BeforeClasspublic 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();}@Testpublic 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,可以在日志中看到数据包前后大小和内容。
页:
[1]