servicio obtener example desde crear consumir como cliente cero java jaxb cxf webservice-client out-of-memory

java - obtener - ¿Cómo fusionar partes comunes de WSDL y XSD de diferentes servicios?



crear web service soap java eclipse (2)

El mejor truco es servir un wsdl estático. Simplemente abra el wsdl, guárdelo, cárguelo en el servidor e indique al cliente que apunte al estático en lugar del auto dinámico generado.

Tengo que interactuar con un conjunto de servicios web que vienen con su propio WSDL y XSD. Los XSD a veces se combinan en un solo archivo, a veces distribuidos en varios archivos (20-30). Sin embargo, por experiencia, sé que la mayoría de la estructura del mensaje y los datos comparten un gran subconjunto común, quizás solo el 20% son diferentes entre las diferentes transacciones.

Lamentablemente, no tengo control sobre las partes del servidor ni sobre la declaración de los servicios, por lo que no puedo hacer nada para solucionarlos. Una primera versión del cliente generó cada servicio por separado y luego los usó como fachadas individuales para formar un servicio coherente de nivel superior como adaptador para otro sistema.

Utilicé CXF con el enlace JAXB predeterminado e impuse diferentes paquetes generados para cada servicio. Hice esto porque la mayoría de los servicios utilizan un modelo de datos común, pero no todos usan la misma versión o personalización, por lo que tengo conflictos y, por lo tanto, opté por la fuerza bruta para poder hacer el sistema.

Sin embargo, esto hace que los requisitos de memoria del adaptador se disparen a medida que cada servicio carga su contexto. En este momento tengo más de 500M de memoria utilizada solo para el adaptador que aloja a los clientes del servicio incluso antes de comenzar a enviar solicitudes y procesar respuestas. Aunque puedo ejecutar el sistema sin problemas utilizando la situación actual, esto crea restricciones que ponen en peligro la implementación de la solución; mi cliente desea reducir esto drásticamente (60% o más) para que este sistema pueda instalarse junto con otros sin necesidad de actualizaciones de hardware.

La pregunta es la siguiente: ¿Existe una herramienta o técnica que me permita unir las partes comunes de cada transacción para que se puedan generar una vez y hacer referencia cuando sea necesario?

No estoy obligado a CXF o JAXB más allá del tiempo requerido para redefinir el sistema hacia un marco diferente o enlaces de datos.

Gracias de antemano por su ayuda.

--- EDITAR ---

Gracias Blaise. Esto apunta a una característica de JAXB que sería útil: los episodios. Desafortunadamente, todavía necesito extraer la parte base común de los diferentes servicios. Así que ahora lo que necesito es un medio para extraer estas partes comunes a través de un diff estructural, que es una herramienta de diferencias que estaría al tanto de la estructura y la jerarquía de tipos que describe el XSD para que se puedan colocar las referencias adecuadas para conectar las secciones comunes con Las partes especializadas.


Si desea reducir un poco, una tecnología de clasificación alternativa (en cualquier marco) podría hacer el truco: suelte JAXB y pruebe JiBX, que se agregó a la última versión de CXF, o tal vez solo a StAX.

Ya que está buscando hacer algo un poco más personalizado que los servicios de estilo JAX-Ws / JAXB convencionales, puede considerar Spring-WS.

Spring-WS le da control sobre todos los aspectos de la pila de servicios web. Puede enrutar mensajes de diferentes maneras (carga útil, expresiones XPath, etc.), y puede usar cualquier tecnología de clasificación / serialización que desee (Jibx, jDOM, SAX, etc.)

Aquí hay una tabla que ilustra las opciones: http://static.springsource.org/spring-ws/sites/2.0/reference/html/server.html#d4e1062

Si realmente desea ser elegante, puede tomar una de las API de nivel inferior, comenzar a ordenar el mensaje y, una vez que llegue a la masa crítica para una de sus áreas comunes, comience un mariscal de JAXB en el momento.

La capacidad de enrutar mensajes a diferentes ''puntos finales'' (en Spring-WS) significa que también puede hacer cosas como "aceptar cualquier mensaje" en esta única interfaz (que se parece a DOM / SAX / etc) y luego tener una gran reorganización Operación allí.

La clave que Spring-WS le comprará aquí es romper el molde de JAX-WS, jugar un poco por adelantado, y luego siempre puede regresar a JAXB más adelante, ya sea en interceptores, su aplicación, etc. En teoría, puede hacer lo mismo con JAXB DOM Source, pero es mi opinión que la pila Spring-WS le brinda el control más preciso para situaciones especiales como la que tiene aquí.