from - soap ws security example java
¿SOAP web service callback architecture? (4)
¿Ha considerado el enfoque más simple de "pub-sub" utilizando un producto de mensajería? (Como MQ, EMS o ActiveMQ)
Los requisitos que describe no parecen ajustarse a los escenarios "clásicos" de solicitud / respuesta / sincronización de servicios web SOAP.
En una solución Pub / Sub, los clientes se suscriben a un tema una vez, y los editores (en su caso, el Servidor) pueden publicar cualquier número de mensajes relevantes para todos los suscriptores.
Como beneficio adicional, la mayoría de los productos de mensajería incluyen soporte para "suscriptores duraderos", por lo que el cliente puede estar fuera de línea a veces y recibir todos los mensajes después de la reconexión.
En su caso, el servidor podría albergar un Servidor ActiveMQ (gratuito) ... Proporcionando la mayor parte de la característica que parece buscar.
Si va por ese camino, le sugiero que elija un producto compatible con JMS con soporte para .Net.
Soy bastante nuevo en los servicios web, JAX-WS, etc. así que tal vez noob pregunta ...
Entonces, quiero implementar un servicio web para hacer que dos sistemas se comuniquen. El sistema "cliente" está interesado en los eventos que se generan en el sistema "servidor". Pero el "sistema de cliente" es en sí mismo un servidor para una aplicación diferente. El servidor es Java (GUERRA en tomcat). El cliente es .Net.
Debe haber solo un sistema de cliente, pero varios procesos de cliente dentro del sistema de cliente, cada uno interesado en distintas categorías de eventos.
Implementaré el lado del servidor y un cliente de prueba. Alguien más implementará el código .Net.
La secuencia de ejecución debe ser a lo largo de esta línea:
- El servidor se está ejecutando ...
- El cliente inicia la conversación, "se registra" en el servidor y solicita algunos datos iniciales.
- El servidor mantiene una lista de puntos finales de clientes registrados
- En el servidor hay un oyente que recibe una notificación cuando ocurren ciertos eventos. Luego pasará por la lista de clientes registrados y reenviará el evento a cada uno de ellos
- En algún momento, el cliente puede "cancelar el registro" sin notificar al servidor que ya no desea recibir eventos.
Primero, ¿suena como algo razonablemente factible?
¿Y hay un mecanismo incorporado estándar, que utiliza SOAP (JAX-WS en el servidor, lo que está disponible con .Net n el cliente), que el servidor puede usar para obtener un punto final de devolución de llamada del cliente?
Por ejemplo, hice algo muy similar con RMI, en este caso el cliente puede simplemente enviar una referencia remota a sí mismo, que el servidor solo puede almacenar y consultar la referencia más adelante.
Finalmente, ¿existe una biblioteca estándar para almacenar referencias de puntos finales, realizar devoluciones de llamadas (colectivas) y, tal vez, mantener la lista actualizada, eliminando los clientes que no responden, por lo que algunas llamadas "ping"?
Nota para mayor claridad: necesito algo más que un método asíncrono con devolución de llamada: un mensaje del cliente generará muchos mensajes de devolución de llamada de servidor a cliente.
Los clientes asíncronos son compatibles con los servicios basados en WSDL mediante el uso de sondeos y devoluciones de llamadas . En tu caso, creo que el requisito es relativamente más complicado.
La página de doc de middleware de fusión de Oracle tiene un escenario que le ayudará. Detalla un método que permite a los clientes enviar solicitudes que generan un HTTP 202 (aceptado) y los clientes luego esperan una respuesta en las colas de mensajes. En su caso, el escenario puede modificarse a partir del que se muestra a continuación.
Inicie varias colas de respuesta para cada categoría de devolución de llamada. Los clientes pueden filtrarlos mediante el suministro de un cliente y una identificación de categoría para la cola. Esto servirá como un mecanismo de devolución de llamada para cada cliente o los procesos que se rigen bajo cada cliente. El MDB puede estar respaldado por un almacén de archivos o almacén de DB para garantizar la confiabilidad y la entrega por única vez.
Por supuesto, no necesita Oraclewareware para implementar esto. Puede usar RabbitMQ o Redis (con transacciones) para acusar recibo de un mensaje en el cliente. Si su cliente desea cancelar el registro, haga una llamada y deje de escuchar la cola.
No conozco ningún estándar de la industria que se ajuste a su escenario, pero creo que esta solución debería funcionar bien para usted.
Para aquellos que llegan desde los motores de búsqueda:
Puede utilizar un WebHook para API web hoy en día, que funciona esencialmente como OP descrito.
En REST, por ejemplo, el cliente tendrá un punto final HTTP que está dedicado a recibir eventos / notificaciones POST del servidor real. El cliente registra su punto final con el servidor real dándole un URI en su punto final de notificación. A partir de ese momento, el servidor real puede realizar una POST en el punto final de notificación del cliente. Esencialmente es una devolución de llamada complicada, si está familiarizado con la terminología asíncrona.
Quizás Java o .Net ya tengan bibliotecas para WebHooks.
Dicho esto, los estándares SSE y Websocket proporcionan mensajes push y en tiempo real mientras son compatibles con HTTP y la mayoría de los navegadores.
Las variaciones largas de sondeo también se usaron en el pasado, y ahora a veces se llaman Comet como un agregado.
Parece que desea implementar un mecanismo de notificación para informar a los clientes anónimos arbitrarios.
Le sugiero que primero considere cómo pasaría la información usando mensajes SOAP. Luego puede considerar cómo lograr esto usando java - JAX-WS o bibliotecas adicionales no estándar. El punto es que puede haber limitaciones o suposiciones importantes requeridas para transferir mensajes SOAP. Por ejemplo, los cortafuegos pueden bloquear sus mensajes HTTP, los clientes pueden "clientes justos" sin capacidad de actuar en un rol de servidor para recibir solicitudes de notificación SOAP
Nota: Un mecanismo de devolución de llamada asíncrona se define en JAX-WS 2.0, donde el servicio obtiene la referencia de punto final del cliente. Este es el mismo tipo de funcionalidad proporcionada por la solución patentada de WebLogic / Fusion descrita por Deepak Bala. Websphere tiene una solución de sincronización patentada similar. Ninguno de estos cumple con sus requisitos, ya que solo permiten una sola respuesta por solicitud.
Opciones de SOAP:
Mensajes SOAP propietarios: la "Opción 100% de" hágalo usted mismo "
Diseñas esquemas completos de carga útil SOAP y patrón de intercambio de mensajes.
Puede enviar la notificación del servidor al cliente si conoce la dirección del punto final SOAP del cliente. El cliente puede transferir su dirección de punto final SOAP dentro de la carga útil de solicitud SOAP original. Algún tiempo después, el servidor puede enviar una solicitud SOAP al cliente.
Problemas / Suposiciones: (1) necesita una ruta de comunicación SOAP / HTTP para las solicitudes de servidor a cliente; no se garantiza cuando existen firewalls; (2) el cliente debe conocer su esquema de notificación; de hecho, el cliente debe actuar como un punto final de servicio para recibir la solicitud de notificación SOAP. Esas son dos grandes suposiciones SI intentas dar soporte a clientes anónimos arbitrarios: eso no es algo que SOAP "simplemente apoye". Ambos extremos necesitan diseñar todo esto en detalle. De hecho, para hacer esto de una manera segura para el servicio, el cliente debe declarar su propia interfaz WSDL de servicio para que pueda invocarla. (3) Como se insinuó anteriormente, muchos clientes son "solo clientes", es posible que no tengan un servidor HTTP para aceptar solicitudes SOAP.
Por lo tanto, para que las notificaciones patentadas de "inserción" funcionen, ambas partes necesitan servidores y ambas necesitan publicar sus interfaces SOA.
Alternativamente, puede llevar la notificación al cliente. El cliente puede usar una solicitud de notificación para el servidor que está bloqueando o sondeando. El servidor puede responder con la notificación o nada o error.
Problemas / Suposiciones: (1) los servidores HTTP (es decir, el servidor SOAP) no admiten solicitudes de bloqueo, como regla, lo que significa que debe sondear; (2) el cliente debe conocer su esquema de notificación; de hecho, el cliente debe actuar como un punto final de servicio para recibir la solicitud de notificación SOAP. Esas son dos suposiciones muy grandes para un cliente anónimo arbitrario: eso no es algo que SOAP "simplemente apoye". Ambos extremos necesitan diseñar todo esto en detalle. De hecho, para hacer esto de una manera segura para el servicio, el cliente debe declarar su propia interfaz WSDL de servicio para que pueda invocarla.
Igual que arriba, pero haga incluir datos de direccionamiento de WS en encabezados de SOAP para informar a cada lado de la dirección de punto final de la otra.
Básicamente, los mismos problemas / suposiciones que la primera opción. Las direcciones de direccionamiento WS lo ayudarán a enrutar inteligentemente los mensajes SOAP a la dirección URL correcta, pero nada más.
Use la notificación WS
Esta especificación fue diseñada para su escenario.
El subestándar WS-BaseNotification satisfaría sus necesidades. Proporciona definiciones de puertos WSDL para productores y consumidores de notificaciones. Proporciona una solución compatible con estándares WS para la suscripción de un consumidor a un productor y una notificación de los productores a los consumidores.Problemas / Limitaciones: (1) NO define el formato de las cargas de notificación. La carga útil de Notificación es específica del dominio de la aplicación (diseño patentado). El estándar no define ninguna notificación o mensaje "estándar" o "incorporado". (2) Tiene los mismos problemas con las notificaciones HTTP que pasan por los firewalls como se mencionó anteriormente. (3) WS-Notification no es un estándar admitido de Java EE / JAX-WS (pero hay muchos servidores de aplicaciones, de código abierto y comerciales, que lo admiten como una extensión).
Use una solución de cola de mensajes (por ejemplo, JMS) con tráfico encapsulado en HTTP. Esto requiere un diseño patentado de cargas útiles que pasen entre el cliente y el servidor y contratos de retroalimentación entre las dos partes. Una ventaja es que el cliente puede ser un cliente puro, con un detector de mensajes invocado en un hilo cuando se recibe un mensaje.
Problemas / Limitaciones: (1) Tiene los mismos problemas con las notificaciones HTTP que pasan por los firewalls como se mencionó anteriormente. (2) Es una implementación de bricolaje. (3) Usa más tecnología que la que usa actualmente.
Resultado final:
Necesita que al menos parte de su solución sea un diseño propietario: los estándares SOAP / WS no cumplen con sus requisitos completos. En teoría, este diseño patentado podría aprovechar un producto para proporcionar gran parte del trabajo de campo, PERO el diseño del esquema de notificación debería ser creado e integrado por usted.
Si desea enviar notificaciones, necesita algún tipo de contrato para las notificaciones que pasan al cliente, el cliente debe actuar como un servidor SOA y necesita los firewalls abiertos para su tráfico. La mayoría de las corporaciones no permiten que las solicitudes HTTP salgan de un servidor y se transfieran a un cliente; normalmente se necesita una razón muy buena para abrir puertos de firewall e incluso entonces, muchas empresas no lo permitirán ...
Si desea que los clientes realicen sondeos para notificaciones, solo necesita una interfaz WSDL básica en el lado del servidor a la que los clientes puedan llamar con frecuencia.
Opción futura: Web socket HTML5
Si su cliente es una aplicación HTML5, los servidores habilitados con sockets web pueden enviar tráfico al navegador, y existe la posibilidad de que las empresas abran firewalls. Los mensajes SOAP pueden viajar a través de sockets web HTTP, lo que le permite enviar notificaciones.