Usar confirmaciones
El motor de mensajería de BizTalk genera confirmaciones positivas (ACK) y confirmaciones negativas (NACK) en respuesta a situaciones que ocurren durante el procesamiento de un mensaje a través de un puerto. BizTalk Server publica una confirmación positiva para indicar que un mensaje se ha transmitido correctamente y una confirmación negativa para señalar que ha habido un error de transmisión y que se ha suspendido el mensaje.
¿Por qué se utilizan las confirmaciones?
Las confirmaciones positivas y negativas proporcionan información eficaz que permite determinar si un mensaje ha llegado al destino o si se ha producido algún problema en el proceso. Por ejemplo, las confirmaciones son útiles si:
Desea supervisar un puerto de recepción para un nuevo socio comercial con fines de validación de esquemas y otros errores.
Desea marcar el estado de una solicitud de préstamo enviada para aprobación como "en curso" si ésta se envía correctamente a un socio comercial para aprobación o como "con errores" si hay errores en la transmisión (por ejemplo, si el servidor del socio comercial está inactivo).
Procesa intercambios que contienen varios pedidos y desea realizar un seguimiento del número de pedidos transmitidos y no trasmitidos.
Puede realizar las acciones descritas en los escenarios anteriores si utiliza confirmaciones y enrutamiento basado en contenido que use filtros.
Enrutar confirmaciones
Cuando se publica una confirmación ACK o NACK, todas las propiedades de contexto del mensaje que causó la generación de una confirmación ACK o NACK se degradan. Cualquier propiedad promocionada no pasa al flujo de confirmación. Para enrutar una confirmación, cree un filtro con las siguientes propiedades desde el espacio de nombres BTS :
Nombre de propiedad | Tipo de datos | Descripción |
---|---|---|
BTS.AckFailureCategory | xs:int | Identifica el errorCategory, que proporciona el lugar y el motivo de la suspensión. |
BTS.AckFailureCode | xs:string | Identifica el código de error, que proporciona el lugar y el motivo de la suspensión. |
BTS.AckType | xs:string | El valor es ACK para una confirmación positiva y NACK en el caso de una confirmación negativa. |
BTS.AckID | xs:string | Identifica el MessageID del mensaje original. |
BTS.AckOwnerID | xs:string | Identifica el Id. de instancia del mensaje original. |
BTS.CorrelationToken | xs:string | Identifica el token de correlación del mensaje original, si hay alguno presente. |
BTS.AckDescription | xs:string | Identifica el errorDescription, que proporciona el lugar y el motivo de la suspensión. |
BTS.AckSendPortID | xs:string | Identifica el SendPortID del mensaje original. |
BTS.AckSendPortName | xs:string | Identifica SendPortName del mensaje original. |
BTS.AckOutboundTransportLocation | xs:string | Identifica OutboundTransportLocation del mensaje original. |
BTS.AckReceivePortID | xs:string | Identifica receivePortID del mensaje original. |
BTS.AckReceivePortName | xs:string | Identifica receivePortName del mensaje original. |
BTS.AckInboundTransportLocation | xs:string | Identifica inboundTransportLocation del mensaje original. |
Nota
Las propiedades que contienen información de errores no se incluyen en las confirmaciones ACK, ya que estas confirmaciones indican que la entrega se ha realizado.
Cuerpo del mensaje de una confirmación negativa
Gran parte de la información importante acerca de una confirmación positiva o negativa se incluye en las propiedades de contexto. Además de las propiedades de contexto, las confirmaciones NACK contienen una sección denominada cuerpo del mensaje que incluye un error de SOAP. El formato del error de SOAP es el siguiente:
<?xml version="1.0" encoding="utf-8"?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP:Body>
<SOAP:Fault>
<faultcode>Microsoft BizTalk Server Negative Acknowledgment </faultcode>
<faultstring>An error occurred while processing the message, refer to the details section for more information </faultstring>
<faultactor>C:\Projects\Sample\Locations\Response\FM_%MessageID%.xml</faultactor>
<detail>
<ns0:NACK Type="NACK" xmlns:ns0="http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd">
<NAckID>{FFB1A60B-E593-4620-8897-4E9C7030A937}</NAckID>
<ErrorCode>0xc0c01658</ErrorCode>
<ErrorCategory>0</ErrorCategory>
<ErrorDescription>There was a failure executing the send pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLTransmit, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "XML assembler" Send Port: "Failed Message" URI: "C:\Projects\Sample\Locations\Response\FM_%MessageID%.xml" Reason: This Assembler cannot retrieve a document specification using this type: "http://Sample#Unknown". </ErrorDescription>
</ns0:NACK>
</detail>
</SOAP:Fault>
</SOAP:Body>
</SOAP:Envelope>
El mensaje de excepción generado por el adaptador se encuentra en la sección de detalles de SOAP del elemento ErrorDescription.
Tener acceso al cuerpo del mensaje desde una orquestación
Si tiene un puerto de orquestación que requiere notificación de entrega, el elemento DeliveryFailureException generado como resultado de un error de transmisión se deserializa desde el error de SOAP incluido en el cuerpo del mensaje NACK. Para tener acceso a la cadena del mensaje de excepción desde la orquestación, convierta el elemento DeliveryFailureException en un elemento SoapException y, a continuación, obtenga acceso a InnerXml como se muestra en el siguiente código:
// Cast the DeliveryFailureException to a SoapException…
System.Web.Services.Protocols.SoapException se = (System.Web.Services.Protocols.SoapException)e.InnerException;
System.Diagnostics.Trace.WriteLine(se.Detail.InnerXml);
//e is an Microsoft.XLANGs.BaseTypes.DeliveryFailureException
//object type created in an Exception handler
El ejemplo de código anterior devuelve un fragmento XML similar al siguiente:
<?xml version="1.0" encoding="utf-8"?>
<ns0:NACK Type="NACK" xmlns:ns0="http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd">
<NAckID>{FFB1A60B-E593-4620-8897-4E9C7030A937}</NAckID>
<ErrorCode>0xc0c01658</ErrorCode>
<ErrorCategory>0</ErrorCategory>
<ErrorDescription>There was a failure executing the send pipeline: "Microsoft.BizTalk.DefaultPipelines.XMLTransmit, Microsoft.BizTalk.DefaultPipelines, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "XML assembler" Send Port: "Failed Message" URI: "C:\Projects\Sample\Locations\Response\FM_%MessageID%.xml" Reason: This Assembler cannot retrieve a document specification using this type: "http://Sample#Unknown".</ErrorDescription>
</ns0:NACK>
¿Cuándo se publica una confirmación?
Las confirmaciones positivas (ACK) y negativas (NACK) se publican en la base de datos del cuadro de mensajes en el momento en que se produce el error si al menos una suscripción coincide. Por ejemplo, si BizTalk Server no encuentra un esquema coincidente para un mensaje leído desde un puerto de recepción y no hay suscripciones NACK, suspenderá el mensaje (si no se ha habilitado el enrutamiento de mensajes con errores) y no publicará un mensaje NACK.
Consulte también
Tratamiento de errores
Utilizar el enrutamiento de mensajes con errores