Compartir a través de


Cómo funciona el ejemplo de rampa de itinerario

La aplicación cliente de prueba de itinerarios de ejemplo compila un conjunto de encabezados SOAP que contienen el itinerario que se crea mediante los controles de la ventana de la aplicación cliente, carga el archivo de mensaje especificado desde el disco, anexa los encabezados de itinerario al mensaje y los envía al ESB a través de una rampa de itinerario para su procesamiento. Si el itinerario genera una respuesta, la aplicación recopila la respuesta y la muestra en la ventana de la aplicación.

Puede elegir entre varios archivos de configuración de itinerarios de ejemplo para ver escenarios unidireccionales y bidireccionales que usan orquestaciones, mensajería o una combinación de ambos.

Para ayudarle a comprender cómo el servicio De itinerarios usa la información de itinerario en un mensaje, el siguiente XML muestra el archivo de configuración de itinerario de ejemplo denominado TwoWay-OrchTransform-OrchRoutingGroup-OrchTwoWayCustom.xml usado en el ejemplo anterior. La primera sección de este itinerario especifica tres pasos de invocación de servicio.

<Itinerary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uuid="" beginTime="" completeTime="" state="Pending" isRequestResponse="false" servicecount="0" xmlns="http://schemas.microsoft.biztalk.practices.esb.com/itinerary">  
  <BizTalkSegment interchangeId="" epmRRCorrelationToken="" receiveInstanceId="" messageId="" xmlns="" />  
  <ServiceInstance name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" position="0" isRequestResponse="false" xmlns="" />  
  <Services xmlns="">  
    <Service uuid="92d3b293-e6d4-44a1-b27d-c42b48aec667" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Transform" type="Orchestration" state="Pending" isRequestResponse="false" position="0" serviceInstanceId="" />  
  </Services>  
  <Services xmlns="">  
    <Service uuid="774488bc-e5b9-4a4e-9ae7-d25cdf23fd1c" beginTime="" completeTime="" name="Microsoft.Practices.ESB.Services.Routing" type="Orchestration" state="Pending" isRequestResponse="false" position="1" serviceInstanceId="" />  
  </Services>  
  <Services xmlns="">  
    <Service uuid="" beginTime="" completeTime="" name="ProcessAndRespond" type="Orchestration" state="Pending" isRequestResponse="true" position="2" serviceInstanceId="" />  
  </Services>  
  ...  

Siguiendo la lista de pasos de invocación de servicio en el itinerario es la sección que contiene detalles de los solucionadores (representados por cadenas de conexión) que permiten al servicio De itinerario localizar o proporcionar información de resolución para cada servicio definido en el itinerario.

  ...  
<ResolverGroups xmlns="">  
    <Resolvers serviceId="Microsoft.Practices.ESB.Services.Transform0"><![CDATA[BRE:\\Policy=ResolveMap;Version=1.0;UseMsg=False;]]></Resolvers>  
    <Resolvers serviceId="Microsoft.Practices.ESB.Services.Routing1"><![CDATA[STATIC:\\TransportType=FILE;TransportLocation=C:\Projects\Microsoft.Practices.ESB\Source\Samples\DynamicResolution\Test\Filedrop\OUt\%MessageID%.xml;Action=;EndpointConfig=;JaxRpcResponse=False;MessageExchangePattern=;TargetNamespace=;TransformType=;]]><![CDATA[UDDI3:\\ServerUrl=http://localhost/uddi;SearchQualifiers=andAllKeys;CategorySearch=;BindingKey=uddi:esb:orderfileservicev3.1;]]></Resolvers>  
    <Resolvers serviceId="ProcessAndRespond2" />  
  </ResolverGroups>  
</Itinerary>  

Nota

El contenido real de cada <elemento Resolvers> no contiene los caracteres de espacio en blanco usados para encapsular las líneas de la lista anterior.

Estos son los tres pasos definidos en la configuración anterior del itinerario:

  1. Ejecute la orquestación Microsoft.Practices.ESB.Services.Transform para transformar el mensaje con la directiva ResolverMap mediante el motor de reglas de negocios (BRE) de BizTalk.

  2. Ejecute la orquestación Microsoft.Practices.ESB.Services.Routing para enrutar el mensaje transformado a varias ubicaciones mediante el enrutamiento Microsoft.Practices.ESB.Services.Routing1. La <sección ResolverGroups> contiene un <elemento Resolvers> con este identificador, que define las cadenas de conexión.

  3. Ejecute la orquestación ProcessAndRespond proporcionada con este ejemplo. La implementación de esta orquestación envía como respuesta una copia del mensaje de solicitud al cliente de prueba de itinerarios.

    Con la finalización de cada servicio, el servicio avanza el itinerario y promueve el siguiente servicio definido en el itinerario para que sea la instancia de servicio actual, con su estado establecido en Pendiente.

Nota

En el ejemplo de rampa de itinerario se usa la resolución dinámica para enviar mensajes a la carpeta de salida. Este es el motivo por el que no hay ningún puerto de envío estático definido para este ejemplo.

A continuación se muestra la secuencia de eventos que se producen después de que la aplicación cliente de prueba envíe el mensaje:

  • El puerto de recepción OnRamp.Itinerary recibe el mensaje.

  • La canalización ItineraryReceiveXml extrae el itinerario del encabezado SOAP, lo valida y procesa previamente, escribe el itinerario como una propiedad de contexto de mensaje en el mensaje entrante y publica el mensaje en la base de datos de cuadro de mensajes de BizTalk.

  • Una suscripción para la orquestación del servicio Microsoft.Practices.ESB.Services.Transform desencadena la invocación de esta orquestación. La orquestación recupera primero el paso de itinerario actual pasando el mensaje actual como parámetro, como se muestra en el código siguiente.

    itineraryStep =   itinerary.Itinerary.GetItineraryStep(InboundMessage);  
    
  • El objeto ItineraryStep contiene toda la información sobre la instancia de servicio actual para su ejecución, así como cualquier solucionador asociado a él.

  • El objeto Resolver se recupera de la instancia de ItineraryStep y el marco de resolución de ESB se usa para resolver el nombre completo del mapa de transformación, como se muestra en el código siguiente.

    resolverDictionary =   
       Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage,  
                                                            resolver);  
    
    // Set the transform type.  
    transformType = resolverDictionary.Item("Resolver.TransformType");  
    
  • Microsoft BizTalk ESB Toolkit Resolver and Adapter Framework lo logra cargando el solucionador adecuado desde la memoria caché (en este ejemplo, el solucionador del motor de reglas de negocios de BizTalk), que invoca la directiva ResolverMap y rellena el objeto ResolverDictionary .

  • Una vez completada la orquestación, el código llama al método AdvanceItinerary , como se muestra en el código siguiente.

    // Call the Itinerary helper to advance to the next step.  
    itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);  
    
  • Esto avanza el itinerario actual actualizando sus propiedades y promocionando el siguiente servicio definido en el itinerario como el que se va a ejecutar a continuación. El método copia el itinerario en el mensaje de salida, que el servicio vuelve a publicar en la base de datos cuadro de mensaje a través de un puerto de envío enlazado directamente.

  • Una suscripción para la orquestación del servicio Microsoft.Practices.ESB.Services.Delivery desencadena la invocación de esta orquestación. Esta orquestación sigue un proceso similar al primero, obteniendo el paso de itinerario actual. Sin embargo, esta orquestación recorre en iteración una colección de solucionadores devueltos por la instancia de ItineraryStep . Para cada solucionador de la colección, la orquestación de entrega usa el marco de resolución y adaptador de Microsoft BizTalk ESB Toolkit para resolver las ubicaciones de transporte y promoverlas como propiedades de contexto dentro del mensaje saliente, como se muestra en el código siguiente.

    // Move to retrieve the first resolver.  
    resolver = resolvers.Current;  
    
    // Pass the resolver configuration to the Resolver Manager   
    // for resolution.  
    resolverDictionary =  
       Microsoft.Practices.ESB.Resolver.ResolverMgr.Resolve(InboundMessage,  
                                                            resolver);  
    
    // Set the transport properties.  
    transportLocation =   
       resolverDictionary.Item("Resolver.TransportLocation");  
    transportType =   
       resolverDictionary.Item("Resolver.TransportType");  
    
    // Call the Adapter Manager to set all necessary properties.  
    Microsoft.Practices.ESB.Adapter.AdapterMgr.SetEndpoint(  
                                    resolverDictionary, DeliveryMessage);  
    
    // Set the delivery port address and type.  
    DeliveryPort(Microsoft.XLANGs.BaseTypes.Address) = transportLocation;  
    DeliveryPort(Microsoft.XLANGs.BaseTypes.TransportType) = transportType;  
    
  • Una suscripción para la orquestación ProcessAndRespond desencadena la invocación de esta orquestación debido a una coincidencia de las propiedades de contexto del mensaje definidas para las propiedades de expresión de filtro.

    (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == :"ProcessAndRespond")   
    && Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending")  
    && (Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration")  
    
  • La orquestación ProcessAndRespond avanza el itinerario y devuelve el mensaje de solicitud original al servicio de rampa a la aplicación Cliente de prueba de itinerarios como respuesta.