Utilisation d'expressions pour exécuter des pipelines
BizTalk Server a la possibilité d’appeler de manière synchrone un pipeline à partir d’une orchestration. Cela permet aux orchestrations d'exploiter le traitement des messages encapsulés au sein d’un pipeline (envoi ou réception) contre un ensemble de données sans avoir à envoyer ces données via l'infrastructure de messagerie.
Vous pouvez utiliser cette fonctionnalité pour permettre à une orchestration d'appeler un pipeline d'envoi dans le but de regrouper des messages en un seul échange sortant. Inversement, une orchestration peut appeler un pipeline de réception pour décoder et désassembler un échange obtenu en dehors de l'infrastructure de messagerie, en évitant les coûts de traitement lié au passage par MessageBox.
Détails
Les orchestrations utilisent des méthodes dans la classe XLANGPipelineManager (dans l’espace de noms Microsoft.XLANGs.Pipeline ) pour appeler des pipelines d’envoi ou de réception. Un pipeline de réception consomme soit un message unique, soit un échange et génère zéro ou plusieurs messages, comme lorsque le pipeline s'exécute dans un contexte de réception de message au sein de la messagerie BizTalk. Un pipeline d’envoi consomme un ou plusieurs messages et génère un seul message ou échange, toujours comme lorsque le pipeline s'exécute dans un contexte d’envoi de message au sein de la messagerie BizTalk.
Appel d'un pipeline de réception
Pour appeler un pipeline de réception à partir d’une orchestration, l’application appelle la méthode ExecuteReceivePipeline() de la classe XLANGPipelineManager . Cette méthode consomme un échange unique et retourne une collection de zéro ou plusieurs messages (contenus dans un instance de la classe ReceivePipelineOutputMessages). La syntaxe de cette méthode est détaillée dans la référence de bibliothèque de classes .NET pour la classe XLANGPipelineManager .
L’API exécutant le pipeline de réception à partir d’une orchestration est :
// Execute receive pipeline
static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);
Un appel à un pipeline de réception est généralement effectué dans une forme Expression au sein de l’orchestration.
Pour appeler un pipeline de réception depuis une orchestration, le développeur doit faire référence à l’assembly du pipeline dans le projet d’orchestration. L’exemple suivant illustre une orchestration appelant un pipeline de réception.
Pour obtenir un exemple plus détaillé, consultez l’exemple sdk de processeur de messages composé (BizTalk Server sample).
Notes
Une variable de type ReceivePipelineOutputMessages ne peut être déclarée que dans une étendue atomique dans une orchestration. Cela vient du fait que les variables de ce type ne sont pas sérialisables et par conséquent ne peuvent garantir la persistance de l'orchestration, et les orchestrations ne sont pas conservées pendant l’exécution au sein d’une portée atomique. Cela signifie qu’un pipeline de réception ne peut être exécuté qu'une seule fois au sein d'une étendue atomique.
Notes
Lorsque vous appelez un pipeline PassThruReceive ou un composant de pipeline personnalisé à partir d’une orchestration, vous devez déclarer le type de variable pour le message entrant comme System.Xml. XmlDocument, même si le type de message entrant est XML ou non. Par conséquent, vous rencontrerez peut-être une exception si vous essayez d’intervenir dessus si le message entrant n'est pas un message XML, un message de format fichier plat par exemple. C’est pour cette raison qu’un moteur d’orchestration prévoit d’utiliser System.Xml.XmlDocument pour tous les types de message entrant dans le scénario décrit ci-dessus.
Appel d'un pipeline d’envoi
Pour appeler un pipeline d’envoi à partir d’une orchestration, l’application appelle la méthode ExecuteSendPipeline() de la classe XLANGPipelineManager . Cette méthode consomme une collection d’un ou plusieurs messages (contenus dans un instance de la classe SendPipelineInputMessages) et retourne un échange unique. La syntaxe de cette méthode est détaillée dans la référence de bibliothèque de classes .NET pour la classe XLANGPipelineManager . Étant donné que l’exécution d’un pipeline d’envoi génère un nouvel échange, l’appel à la méthode ExecuteSendPipeline() doit être effectué dans une forme d’affectation de message, comme suit :
L’API exécutant le pipeline de d’envoi à partir d’une orchestration est :
// Execute a send pipeline
static public ExecuteSendPipeline(System.Type sendPipelineType, SendPipelineInputMessages inputMsgs, XLANGMessage msg);
Un appel à un pipeline d’envoi doit être effectué dans une forme d’affectation de message au sein de l’orchestration.
Pour appeler un pipeline d’envoi depuis une orchestration, le développeur doit faire référence à l’assembly du pipeline dans le projet d’orchestration. L’exemple suivant illustre une orchestration appelant un pipeline d’envoi.
Notes
Lorsque vous appelez le pipeline XMLTransmit par défaut, vous devez définir la propriété du contexte de message XMLNORM.EnvelopeSpecName sur le nom qualifié complet du schéma d’enveloppe. Par exemple :
MyMessage(XMLNORM.EnvelopeSpecName) = "PipelineSchemas.POEnv, PipelineSchemas, Version=1.0.0.0, Culture=nuetral, PublicKeyToken=12e5cc95621c33e8";
Pour obtenir un exemple plus détaillé, consultez l’exemple de Kit de développement logiciel (SDK) Aggregator (BizTalk Server Sample).
Exécution de pipeline - Différences de comportement
L’exécution d’un pipeline d'envoi ou de réception lorsqu'il est appelé par une orchestration est globalement identique à ce qui se passe lorsque le même pipeline est exécuté au sein d'une infrastructure de messagerie (par exemple, au niveau du port d'envoi ou de réception). Toutefois, dans certains cas, les comportements sont différents, comme l’indiquent les descriptions suivantes.
Différences au sein des étapes du pipeline
L'exécution des étapes au sein d'un pipeline d'envoi ou de réception appelé à partir d'une orchestration est presque identique à l'exécution de ces étapes lorsque le pipeline est appelé à partir de l’infrastructure de messagerie BizTalk, hormis quelques exceptions présentées par étapes ci-dessous.
Assembleur/désassembleur : les étapes assembleur et désassembleur ne traitent pas les données du profil de suivi .
Encodeur/décodeur : l’encodeur MIME signe numériquement les messages à l’aide du certificat configuré sur l’hôte auquel l’hôte est associé. L'encodeur SMIME crypte les messages à l’aide du certificat dans le contexte du message transmis dans le pipeline.
Résolution de schéma
Il existe deux algorithmes de recherche de schéma pris en charge pendant l’exécution d’un pipeline à partir d’une orchestration :
Résolution par type
Résolution par nom
Dans les cas où des schémas dupliqués sont déployés, la logique de l’algorithme pour sélectionner le schéma approprié est identique à celle utilisée lors de l’exécution dans le contexte de l’infrastructure de messagerie.
Pipelines transactionnels
Les pipelines dont les étapes appellent des composants transactionnels n'ont pas de contexte transactionnel disponible. Tout appel à IPipelineContext.GetTransaction() lève NotSupportedException. Cela n’empêche pas l’exécution d’un tel pipeline à partir d’une orchestration, mais cela signifie que le pipeline devra détecter et gérer la situation.
Destination de message
Le contrôle de la destination des messages par composants de pipeline n'est pas prise en charge dans ce contexte. La définition des propriétés de contexte MessageDestination ou SuspendOnRoutingFailure entraîne la levée d’une exception XLANGPipelineManagerException .
Types de composant de pipeline
Les composants de pipeline doivent se fonder sur les éléments suivants pour pouvoir être appelés à partir d'une orchestration.
NET Framework v1.1
NET Framework v2.0
.NET Framework v3.0
.NET Framework v3.5
.NET Framework v4.0
NET Framework v2.0
COM
Restrictions
Les types de pipelines suivants ne peuvent pas être exécutés à partir d’une orchestration :
Pipelines transactionnels
Pipelines récupérables
Pipelines qui appellent l’API d’intercepteur BAM (une exception NotSupportedException sera levée).
La même instance de pipeline ne peut pas être exécutée dans différentes branches d’une forme parallèle, sauf si elle est placée dans une étendue synchronisée dans chaque branche.
Pipelines existants (assemblys) qui ont été créés sur le sdk BizTalk Server 2006.
Modes d’échec et effets
Tout échec dans l’exécution du pipeline qui aurait provoqué la suspension d’un message venait de l’appel d’un pipeline à partir de l’infrastructure de messagerie BizTalk Server Messaging Infrastructure, désormais, seule une exception sera levée. L’exception levée est de type Microsoft.XLANGs.Pipeline.XLANGPipelineManagerException. Cette exception peut être gérée dans un bloc catch au sein de l'orchestration appelant. Si l'orchestration n'intercepte pas l'erreur levée, le moteur XLANGs envoie une erreur dont le texte présente les informations concernant l’exception levée.
L’exception procède au formatage des messages d’erreur générés par les composants du pipeline.
La propriété Message de la classe XLANGPipelineManagerException contient les détails de l’erreur d’exécution du pipeline. Ces détails se présentent au format suivant.
Un échec s’est produit lors de l’exécution du <type de> pipeline. Message> d’erreur au format des détails <de l’erreur.
Dans ce message, <le type> de pipeline est le nom de la classe de pipeline et <le message> d’erreur mis en forme est une description de l’échec spécifique qui s’est produit pendant l’exécution du pipeline.
Par exemple, si une orchestration appelle un pipeline de réception et que l’exécution de ce pipeline échoue parce qu’aucun des composants du pipeline ne reconnaît le message, les valeurs des propriétés de XLANGPipelineManagerException sont les suivantes :
Propriété XLANGPipelineManagerException | Valeur |
---|---|
Message | Il s'est produit une erreur lors de l'exécution du pipeline de réception "MyPipelines.ReceivePipeline". Détails de l’erreur : « Aucun composant de phase de désassemblement ne peut reconnaître les données. |
Composant | String.Empty |
Par exemple, si une orchestration appelle un pipeline d’envoi et que l’exécution de ce pipeline échoue en raison d’un échec de validation, le texte dans la propriété Message de XLANGPipelineManagerException est :
Propriété XLANGPipelineManagerException | Valeur |
---|---|
Message | Il s'est produit une erreur lors de l'exécution du pipeline d’envoi "MyPipelines.SendPipeline". Détails de l’erreur : « Échec de la validation du document : « L’élément nom de l’élément <n’est pas valide - La valeur> de l’élément value <n’est pas valide en fonction de son type de données 'String' - La contrainte Pattern a échoué. »> |
Composant | “Microsoft.BizTalk.Component.XmlValidator” |