繁体   English   中英

如何减少Apache CXF客户端存根对象的内存大小?

[英]How to reduce memory size of Apache CXF client stub objects?

我的Web服务客户端应用程序使用Apache CXF生成客户端存根以与多个Web服务进行通信。 生成的CXF Web服务存根对象具有相当大的内存占用(10 - 15个Web服务对象占用超过64 MB的内存)。 有没有办法减少CXF对象的占用空间?

我们与Axis有类似的问题。 我们遇到的问题是我们想要对Web服务进行许多并发调用,并且使用WSDL生成的Axis客户端导致每个客户端使用大量内存。 客户端不是线程安全的,因此我们必须为每个请求创建一个客户端。

我们有两个选择。 首先,我们可以修剪生成的代码 - 但这对于维护原因并不好。

其次,我们简单地修剪了WSDL以删除与我们无关的部分,并重新生成精简的客户端。 这样,如果我们调用一个服务方法,它的客户端将不包含该线程不会使用的不相关方法的批量。

工作得很好,但仍然是一个维护噩梦,因为任何时候WSDL更新(例如我们的合作伙伴发布他们的Web服务的新版本),我们需要花时间创建削减wsdls。 我想这是一个理想的解决方案,可以让我们的合作伙伴认识到我们的问题并获得减少的WSDL的所有权。

我们对CXF客户端采用了不同的方法。 我没有研究它的内存占用,这在我们的上下文中不是问题,但它肯定是一种比创建存根更简单的开发方法。 它看起来像这样:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

factory.setAddress(endpoint);
factory.getServiceFactory().setDataBinding(new AegisDatabinding());
factory.setServiceClass(myInterface.class);
Object client = factory.create();
((BindingProvider) client).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);

myInterface stub = (myInterface)client;

我们这样做(当然我们已经构建了一些实用程序类来进一步简化)我们想要在运行时连接的任何WS(当然,前提是我们有它的Java接口)。 我们的目标是让整个WS对程序员尽可能透明。 我们对WSDL和XSD 本身并不感兴趣。 我们怀疑我们并不孤单。

如果您的SOAP需求非常基础,那么您可以查看kSOAP2,它实际上是内存高效的。 它旨在在J2ME电话应用程序中正常运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM