首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减少Apache CXF客户端存根对象的内存大小?

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

Stack Overflow用户
提问于 2009-12-23 12:07:06
回答 3查看 2.9K关注 0票数 21

我的web服务客户端应用程序使用Apache CXF生成客户端存根,以便与多个web服务对话。生成的CXF web服务存根对象具有相当大的内存占用(10 - 15个web服务对象占用超过64MB的内存)。有什么方法可以减少CXF对象占用的空间吗?

EN

回答 3

Stack Overflow用户

发布于 2011-05-24 04:20:42

我们在Axis上遇到了类似的问题。我们遇到的问题是,我们希望对web服务进行许多并发调用,而使用WSDL生成的Axis客户端会导致每个客户端使用大量内存。客户端不是线程安全的,所以我们必须为每个请求创建一个客户端。

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

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

工作得很好,但仍然是维护的噩梦,因为任何时候WSDL得到更新(例如,我们的合作伙伴发布了他们的web服务的新版本),我们需要花费时间来创建精简的WSDL。我想,理想的解决方案是让我们的合作伙伴认识到我们的问题,并掌握减少的WSDL的所有权。

票数 1
EN

Stack Overflow用户

发布于 2011-06-12 02:48:21

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

代码语言:javascript
复制
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本身并不感兴趣。我们怀疑我们并不孤单。

票数 0
EN

Stack Overflow用户

发布于 2011-09-23 19:35:04

如果您的SOAP需求非常基本,那么您可以研究一下kSOAP2,它实际上是内存高效的。它被设计成在J2ME phone应用程序中运行良好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1950648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档