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

本文链接: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; @WebService public 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,可以在日志中看到数据包前后大小和内容。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值