在现实应用中有些时候会有比较大的数据对象需要传输,或者在一个比较慢的网络环境下发布调用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;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
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);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
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;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
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());
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
5. 运行此unit test,可以在日志中看到数据包前后大小和内容。
原文链接:http://blog.csdn.net/kongxx/article/details/7530216
【系列文章】