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

2022-09-02 04:53:30

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


答案 1

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

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

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

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


答案 2

我们对 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本身没有兴趣。我们怀疑我们并不孤单。