Apache CXF实战之五:压缩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,可以在日志中看到数据包前后大小和内容。
页:
[1]