我有一个Java应用程序,它使用CXF来调用Web服务。启动器的代码看起来像
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.tempuri.IAPIService;
import javax.inject.Inject;
/**
* Created by flavius on 23/09/14.
*/
@Component()
public class VsJaxWsProxyFactory {
@Inject
private Environment env;
private JaxWsProxyFactoryBean factoryBean = null;
public Object create() {
if (factoryBean == null) {
factoryBean = new JaxWsProxyFactoryBean();
factoryBean.setServiceClass(IAPIService.class);
factoryBean.setAddress(env.getProperty("api.wsdl"));
}
return factoryBean.create();
}
}
应用程序运行正常,但过了一会儿,该框开始消耗太多内存,应用程序开始运行缓慢。当我们尝试进行内存分析时,我们发现了以下内容
似乎CXF以某种方式在每次调用时创建一个新的Service配置对象,并且没有被释放。我在org.apache.cxf.jaxws.support.JaxWsServiceConfiguration类上找不到太多信息,不确定这是配置问题还是某些库中的内部错误。
答案 0 :(得分:2)
这里已经回答: Apache CXF not releasing clients
基本上,同一个JaxWsProxyFactoryBean实例上的.create()方法应该只调用一次,否则会出现内存泄漏:
return factoryBean.create();
factoryBean.create()返回cxf JAX-WS客户端代理,您可以将其重复用于重复调用。如果您不使用此处提到的任何特殊功能,则创建的客户端也是线程安全的http://cxf.apache.org/faq.html#FAQ-AreJAX-WSclientproxiesthreadsafe?