Tengo que interactuar con un conjunto de servicios web que vienen con sus propios WSDL y XSD. Los XSD a veces se fusionan en un único archivo, a veces distribuidos a lo largo de varios archivos (20-30). Sin embargo, por experiencia sé que la mayoría de la estructura y los datos del mensaje comparten un gran subconjunto común, tal vez solo el 20% son diferentes entre las diferentes transacciones.¿Cómo fusionar partes comunes de WSDL y XSD de diferentes servicios?
Lamentablemente no tengo control sobre las partes del servidor o la declaración de los servicios, por lo que no es posible conseguir que lo arreglen. Una primera versión del cliente generó cada servicio por separado y luego los utilizó como fachadas individuales para formar un servicio coherente de nivel superior como un 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 usan un modelo de datos común, pero no todos usan la misma versión o personalización, así que tengo conflictos y opté por la fuerza bruta para poder hacer el sistema.
Sin embargo, esto hace que los requisitos de memoria del adaptador se lleven al techo ya que cada servicio carga su contexto. En este momento tengo más de 500 millones 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 el despliegue de la solución; a mi cliente le gustaría reducir esto drásticamente (60% o más) para que este sistema se pueda instalar junto con otros sin requerir actualizaciones de hardware.
La pregunta es la siguiente: ¿Hay alguna herramienta o técnica que me permita juntar las partes comunes de cada transacción para que se puedan generar una vez y hacer referencia a ellas cuando sea necesario?
No estoy obligado a CXF o JAXB que no sea el tiempo necesario para volver a factorizar 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: episodios. Desafortunadamente, todavía necesito extraer la 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 una diff estructural, que es una herramienta diff que conocerá la estructura y la jerarquía de tipos que describe el XSD para que se establezcan referencias adecuadas para conectar las secciones comunes con las partes especializadas.
Puede estar interesado en seguir esta función relacionada en EclipseLink JAXB (MOXy): https://bugs.eclipse.org/340997 –
¿Están usando un espacio de nombre común para las partes compartidas? Si no, eres SOL porque las distintas partes simplemente no entienden que son lo mismo. –
¿Cuánto cuesta 1 GB de memoria? ¿Cuánto cuesta tu tiempo? Señálelo al cliente. – artbristol