Cuando se configura un nodo SOAP utilizando WSDL, WSDL especifica si una operación de nodo determinada es o no unidireccional. No obstante, configurar un nodo en modalidad de pasarela sin WSDL significa que esta información WSDL no está disponible. Por consiguiente, los nodos SOAP configurados como pasarelas intentan detectar automáticamente operaciones unidireccionales en función del contenido del mensaje.
Detección del nodo SOAPInput
de operaciones unidireccionales
El nodo SOAPInput detecta mensajes unidireccionales de diferentes formas en función del transporte empleado y de si WS-Addressing está o no configurado en el nodo.
- Si el nodo utiliza el transporte HTTP y WS-Addressing está configurado, se determina que la operación es unidireccional si el mensaje de entrada utiliza la dirección WSA:None especial para las direcciones WSA:ReplyTo y WSA:FaultTo.
- Si el nodo utiliza el transporte HTTP y WS-Addressing no está configurado, no se realizará ninguna detección automática de mensajes unidireccionales.
- Si el nodo utiliza el transporte JMS y WS-Addressing está configurado, se determina que la operación es unidireccional si se cumple alguna de las condiciones siguientes:
- El mensaje de entrada utiliza la dirección WSA:None especial (http://www.w3.org/2005/08/addressing/none) para las direcciones WSA:ReplyTo y WSA:FaultTo.
- No hay ningún destino JMS ReplyTo especificado en el mensaje de entrada y el mensaje de entrada utiliza la dirección especial WSA:Anonymous (http://www.w3.org/2005/08/addressing/anonymous
o http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous)
para las direcciones WSA:ReplyTo y WSA:FaultTo.
- Si el nodo utiliza el transporte JMS y WS-Addressing no está configurado, se determina que la operación es unidireccional si no se ha especificado ningún destino JMS ReplyTo en el mensaje de entrada.
En modalidad de pasarela, el campo
SOAP.Context.operationType se establece en
GATEWAY si se determina que la operación es de tipo solicitud-respuesta o
GATEWAY_ONE_WAY si se determina que la operación es unidireccional. Si se determina que la operación es unidireccional, no es necesaria ni se permite ninguna respuesta. No obstante, si no se determina que la operación es unidireccional, el flujo se configura con la presuposición de que el flujo enviará una respuesta. Por lo tanto, si la operación es unidireccional, debe especificar que la operación es unidireccional con el fin de permitir que el flujo libere recursos, y si se utiliza HTTP para enviar un reconocimiento HTTP 202 de nuevo al cliente de origen. Para ello establezca el siguiente campo en el entorno local antes de grabar un mensaje en un nodo
SOAPReply:
SET OutputLocalEnvironment.Destination.SOAP.Reply.Gateway.OneWay = 'true';
Este valor indica al nodo SOAPReply que complete el Patrón de intercambio de mensajes antes de enviar un reconocimiento HTTP 202, si es necesario, y liberar recursos.
Una solución para utilizar este valor sería en una pasarela como ésta:
En este flujo, el nodo Compute determina si el mensaje es unidireccional. Si el mensaje es undireccional, el nodo Compute establece el valor unidireccional del entorno local y envía un mensaje al nodo SOAPReply para completar el Patrón de intercambio de mensajes. Si el flujo es un flujo de pasarela y se establece la opción de entorno local unidireccional, cualquier mensaje recibido por el nodo SOAPReply hace que se ignore el contenido del mensaje y se complete el Patrón de intercambio de mensajes. A continuación, el flujo puede continuar a través de otro terminal del nodo Compute.
No es erróneo enviar un mensaje al nodo SOAPReply con la opción de entorno local unidireccional establecida si se ha determinado automáticamente que el mensaje es un mensaje unidireccional.
Detección del nodo SOAPRequest de operaciones unidireccionales
En modalidad de pasarela, el nodo detecta automáticamente
SOAPRequest si el mensaje es únicamente unidireccional, si se utiliza WSA y las direcciones
WSA:ReplyTo y
WSA:FaultTo se establecen en la dirección
WSA:None especial.
Para indicar al nodo manualmente que el mensaje es unidireccional, establezca la siguiente opción en el entorno local:
SET OutputLocalEnvironment.Destination.SOAP.Request.Gateway.OneWay = 'true';
Para el nodo SOAPRequest, especificar que un mensaje es unidireccional indica al nodo que no se prevé una respuesta, salvo para un reconocimiento HTTP 202 si se utiliza el transporte HTTP. Si se utiliza el transporte JMS, también permite que el mensaje se envíe bajo el control de cualquier transacción existente, si la Modalidad de transacción tiene el valor Sí o Automático.