Tengo una aplicación en Java que usa CXF para hacer llamadas a un servicio web. El código para el iniciador parece
importar org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
importar org.springframework.core.env.Environment;
importar org.springframework.stereotype.Component;
importar org.tempuri.IAPIService;
importar javax.inyectar.Inyectar;
/**
* Creado por flavius el 23/09/14.
*/
@Componente()
clase pública VsJaxWsProxyFactory {
@Inyectar
Entorno privado env;
privado JaxWsProxyFactoryBean factoryBean = null;
Objeto público crear () {
si (factoryBean == nulo) {
factoryBean = new JaxWsProxyFactoryBean();
factoryBean.setServiceClass(IAPIService.clase);
factoryBean.setAddress(env.getProperty("api.wsdl"));
}
volver factoryBean.create();
}
}
La aplicación funciona bien, pero después de un tiempo, la caja comienza a consumir demasiada memoria y la aplicación comienza a funcionar lentamente. Cuando intentamos hacer un análisis de memoria encontramos lo siguiente
Parece que CXF de alguna manera está creando un nuevo objeto de configuración de servicio en cada llamada y no se está liberando. No puedo encontrar mucha información sobre la clase org.apache.cxf.jaxws.support.JaxWsServiceConfiguration y no estoy seguro de si se trata de un problema de configuración o algún error interno en alguna biblioteca.
Ya respondido aquí: Apache CXF no libera clientes
Básicamente, el método .create() en la misma instancia de JaxWsProxyFactoryBean debe llamarse solo una vez , de lo contrario, se produce una pérdida de memoria:
return factoryBean.create();factoryBean.create() devuelve el proxy del cliente cxf JAX-WS, que puede reutilizar para llamadas repetidas . El cliente creado también es seguro para subprocesos si no usa ninguna de las funciones especiales mencionadas aquí http://cxf.apache.org/faq.html#FAQ-AreJAX-WSclientproxiesthreadsafe?