Compartir a través de


Creación de un servicio de mensajería de itinerarios personalizado

El marco de itinerarios que forma parte del kit de herramientas de ESB de Microsoft BizTalk admite la ejecución de pasos de itinerario mediante clases que implementan la interfaz IMessagingService que ejecuta servicios de mensajería de itinerarios. Puede implementar un servicio de mensajería personalizado cuando desee que el servicio sea responsable de lo siguiente:

  • Validación personalizada de mensajes configurada en el itinerario

  • Transformación de mensajes personalizada configurada en el itinerario

  • Procesamiento personalizado del mensaje

    En todos estos casos, un servicio de itinerario personalizado que implementa actúa como interceptor y lo llama el componente de canalización dispatcher.

    Los servicios de itinerarios personalizados basados en mensajería o los servicios de mensajería implementan la interfaz IMessagingService . Esta interfaz expone las propiedades Name y SupportsDisassemble y los métodos Execute y ShouldAdvanceStep .

    La propiedad Name es el nombre del servicio, ya que aparecerá en un itinerario. Debe coincidir con el nombre configurado en la configuración de servicios de itinerario en el archivo Esb.config.

    La propiedad SupportsDisassemble indica si el servicio de mensajería personalizado que está creando admite el desensamblado y la ejecución de varios solucionadores.

    El método ShouldAdvanceStep toma el paso de itinerario actual y el mensaje actual, y devuelve un valor booleano que indica si el distribuidor debe avanzar el itinerario después de que se ejecute el servicio. En casi todos los casos, este método debe devolver true.

    El método Execute es de mayor importancia para un servicio de mensajería y contiene la lógica que se ejecutará en tiempo de ejecución. Toma el contexto de canalización, el mensaje, la cadena de resolución y el paso de itinerario actual; y devuelve el mensaje actualizado.

    Puede encontrar una implementación de referencia del método Execute en el archivo RoutingService.cs del ESB. El proyecto Itinerary.Services, como se muestra en el código siguiente.

public IBaseMessage ExecuteRoute(IPipelineContext context, IBaseMessage msg, string resolverString)  
        {  
            if (context == null)  
                throw new ArgumentNullException("context");  
            if (msg == null)  
                throw new ArgumentNullException("msg");  
            if (string.IsNullOrEmpty(resolverString))  
                throw new ArgumentException(Properties.Resources.ArgumentStringRequired, "resolverString");  
            try  
            {  
                ResolverInfo info = ResolverMgr.GetResolverInfo(ResolutionType.Endpoint, resolverString);  
                if (!info.Success)  
                    throw new RoutingException(Properties.Resources.ResolverStringInvalid, resolverString);  
  
                // Resolve configuration for routing.  
                Dictionary<string, string> resolverDictionary = ResolverMgr.Resolve(info, msg, context);  
  
                if (string.IsNullOrEmpty(resolverDictionary["Resolver.TransportLocation"]))  
                    throw new RoutingException(Properties.Resources.TransportLocationNotResolved, resolverString);  
  
                AdapterMgr.SetEndpoint(resolverDictionary, msg.Context);  
  
                return msg;  
            }  
            catch (System.Exception ex)  
            {  
                EventLogger.Write(MethodInfo.GetCurrentMethod(), ex);  
                throw;  
            }        
        }  

Para implementar un servicio de itinerarios personalizado para la mensajería

  1. Cree un ensamblado con una clase que derive de IMessagingService; en el método Execute , incluya toda la lógica necesaria para realizar modificaciones en el mensaje o en el contexto del mensaje (si existe).

  2. Agregue una entrada en la sección itineraryServices del archivo Esb.config para el servicio agregando un <elemento itineraryService> con un GUID como atributo id , el nombre del servicio como atributo name , el nombre completo de la clase como el atributo type , Messagingcomo atributo scope y la fase permitida (por ejemplo, OnRampReceive, OnRampSend, OffRampSend, OffRampReceive, AllSend, AllReceive o All) como atributo stage .

  3. Registre el nuevo ensamblado en la caché global de ensamblados.