Tengo múltiples servicios que pueden devolver resultados de miles de clases.
Dado que cada servicio CXF contiene un contexto privado casi idéntico de JAXB, causa una enorme pérdida de memoria.
¿Hay alguna manera de crear el contexto JAXB y compartirlo entre los servicios?Reutilizar CXF contexto jaxb entre servicios múltiples
Respuesta
Una posible manera de resolver es mediante la adición de lo siguiente a la configuración del resorte:
<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
<constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>
Cuando el valor es sólo una referencia a un grano que tiene el mundial (single) JAXBContext y tiene el siguiente método :
public javax.xml.bind.JAXBContext getContext() {...}
puede ver más detalles (incluyendo el gurú CXF entradas Daniel Kulp) en el siguiente hilo:
Reuse-JAXB-context-in-jaxws
Después de probarlo, descubrí que la configuración de JAXBDataBinding actual como una instancia global para servicios múltiples no funcionará ya que hay una instrucción "if" en su método de inicialización que se devuelve una vez que el primer servicio configuró el contexto.
Es por eso que terminé extendiendo la clase y recogiendo todas las clases de servicios requeridas y modelos. Después de que finaliza la inicialización de todos los servicios, creo un contexto global con todas las clases requeridas y lo devuelvo a todos los servicios.
Puede usar la siguiente clase.
Después de que todos sus servicios web estén inicializados, llame al método compileGlobalJAXBContext para crear el contexto global. Puede agregar allí otras clases que la aplicación necesite y la init perdida.
No olvide configurar los servicios para que funcionen con este bean.
public class GlobalJAXBDataBinding extends JAXBDataBinding
{
private Set<Class<?>> globalContextClasses;
private boolean contextBuilt = false;
public GlobalJAXBDataBinding(Set<Class<?>> classes) {
globalContextClasses = new HashSet<>(classes);
globalContextClasses.add(CPUUID.class);
}
public GlobalJAXBDataBinding() {
}
}
public synchronized void initialize(Service service) {
if (contextBuilt)
return;
super.initialize(service);
globalContextClasses.addAll(getContextClasses());
super.setContext(null);
}
public void compileGlobalJAXBContext() {
if (contextBuilt) return;
setContext(JAXBContext.newInstance(globalContextClasses));
contextBuilt *equals* true;
}
Por alguna extraña razón el editor no me dejó añadir el signo igual en la última línea de compileGlobalJAXBContext por lo que sólo sustituir la palabra iguales con el signo correspondiente.
Aprecio que esto sea un poco viejo ahora, pero ¿te importaría publicar la clase si aún la tienes? – DarthPablo
@DarthPablo He adjuntado la clase –
Gracias, ¡eso es muy útil! – DarthPablo
- 1. cxf: generar el constructor jaxb con argumentos
- 2. Rol de JAXB en servicios web basados en Java
- 3. JAXB Excepción: Clase desconocida en este contexto
- 4. Diferencia entre CXF y JAX-WS
- 5. JAXB creando contexto y costo de Marshallers
- 6. Comparación entre Sun Metro y Apache CXF para el desarrollo de servicios web?
- 7. ¿Cómo reutilizar JSON/JAXB de Jersey para la serialización?
- 8. Carga de múltiples archivos y metadatos con CXF
- 9. Diferencia entre Apache CXF y Axis
- 10. Uso XMLBeans enlaces para wsdl2java cxf
- 11. WCF consumir cliente múltiples servicios
- 12. ¿Servicios web por contrato?
- 13. ¿Reutilizar un área MVC en múltiples aplicaciones MVC?
- 14. JAXB esquemas múltiples con referencia de elemento
- 15. Integridad referencial de datos entre servicios
- 16. Dentro de CXF, ¿por qué usar cualquier otro enlace que JAXB? (Archivos adjuntos MTOM, Aegis, XMLBeans, ...)
- 17. Storyboard iOS5: reutilizar UITableViewCell personalizado en múltiples UITableViewControllers
- 18. CXF - ClassCastException (SEIStub/ClientProxy)
- 19. ¿Qué significa CXF en "Apache CXF"?
- 20. APP @TableGenerator compartida entre múltiples entidades
- 21. Grails pruebas de integración con servicios múltiples
- 22. WCF un servicio o servicios múltiples
- 23. Vinculando singleton a servicios múltiples en Ninject
- 24. Mongodb, sharding y múltiples servicios de Windows
- 25. Diferencia entre contexto de actividad y contexto de aplicación
- 26. Servicio web de Microsoft y cliente CXF: JAXB no puede entender "s: schema"
- 27. Cómo clasifico java.util.List con JAXB como JAX-RS (CXF y Jersey) do
- 28. JAXB, CXF: No hay ObjectFactory con @XmlElementDecl para el elemento ... con
- 29. Inicialización de contexto de subprocesos múltiples con resorte?
- 30. Instalación CXF con Eclipse 3.5
Pregunta interesante, pero no sé la respuesta. –
Esto es para jaxrs, pero puede ser que también funcionará para jaxws: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –