Expressions de configuration d'intercepteur
Le fichier de configuration de l’intercepteur BAM utilise des expressions de filtre pour identifier une activité et utilise des expressions de données pour construire un élément de données pour le stockage, comme ID de corrélation ou jeton de continuation, ou à des fins similaires. Quel que soit l’objectif, les expressions individuelles sont identifiées dans le fichier de configuration de l’intercepteur par l’élément expression
et contiennent une ou plusieurs opérations à l’aide de la notation polonaise inverse, également appelée notation postfixée.
À propos de la notation polonaise inverse
Dans le cadre de la notation polonaise inverse (NPI), les opérandes précèdent l'opérateur, supprimant ainsi le besoin d'utiliser des parenthèses comme opérateurs de priorité. Une pile sert à maintenir des valeurs et toutes les opérations et pousser des valeurs sur la pile, retirer (supprimer) des valeurs de la pile ou réaliser une combinaison de poussées et de retraits pour effectuer une opération.
Par exemple, si vous souhaitez évaluer l'expression
5 + (10 - 2)
La conversion de ce en rpn équivalent entraîne
5 10 2 - +
Cela serait évalué comme suit :
Entrée | Opération | Pile |
---|---|---|
5 | Envoi (push) | 5 |
10 | Envoi (push) | 5, 10 |
2 | Envoi (push) | 5, 10, 2 |
- | Soustraire | 5, 8 |
+ | Ajouter | 13 |
En supposant que le système NPI prenne en charge l'opération de concaténation de chaînes, vous pouvez également évaluer l'expression
"The quick brown " + "fox " + "jumped over the lazy " + "dog."
Sa conversion en son équivalent NPI donne :
"The quick brown " "fox " "jumped over the lazy " "dog" + + +
Cela serait évalué comme suit :
Entrée | Opération | Pile |
---|---|---|
« Le jeune » | Envoi (push) | « Le brun rapide » |
« renard » | Envoi (push) | « Le jeune »,« renard » |
« a sauté par-dessus le vieux » | Envoi (push) | « Le jeune »,« renard », « a sauté par-dessus le vieux » |
« chien. » | Envoi (push) | « Le jeune »,« renard », « a sauté par-dessus le vieux », « chien. » |
+ | Concatenate | « Le jeune »,« renard », « a sauté par-dessus le vieux chien. » |
+ | Concatenate | « Le jeune »,« renard a sauté par-dessus le vieux chien. » |
+ | Concatenate | « Le jeune renard a sauté par-dessus le vieux chien. » |
Comme vous pouvez le constater, un nombre arbitraire d'opérations peut être pris en charge, notamment la comparaison, les opérations booléennes et les opérations personnalisées qui extraient les valeurs appropriées pour les opérations auxquelles elles participent. Les valeurs s'accumulent sur la pile et sont poussées et retirées en fonction des opérations individuelles.
Notation polonaise inverse dans le fichier de configuration de l'intercepteur
Vous allez écrire deux types d’expressions dans le fichier de configuration de l’intercepteur : les expressions de filtre et les expressions de données. Les expressions de filtre s’attendent à ce que le résultat de l’expression RPN soit booléen true
ou false
que les expressions de données attendent une valeur unique sur la pile.
Expressions de filtre
Les expressions de filtre sont évaluées en booléen true
ou false
et sont utilisées pour identifier un événement spécifique à suivre dans l’application WF ou WFC. Dans les applications WF, il est courant de filtrer en fonction du nom de l'activité et de l'événement. Par exemple, vous pouvez sélectionner l’activité FoodAndDrinksPolicy lorsqu’elle est fermée. À l'aide d'opérations WF, vous pouvez exprimer le filtre comme suit :
(GetActivityName = "FoodAndDrinksPolicy") && (GetActivityEvent = "Closed")
La conversion de ce en RPN donne les résultats suivants :
GetActivityName "FoodAndDrinksPolicy" == GetActivityEvent "Closed" == &&
La conversion de cette expression en son expression équivalente pour le fichier de configuration de l'intercepteur donne le code XML suivant :
<ic:Filter>
<ic:Expression>
<wf:Operation Name="GetActivityName"/>
<ic:Operation Name="Constant">
<ic:Argument>FoodAndDrinksPolicy</ic:Argument>
</ic:Operation>
<ic:Operation Name="Equals"/>
<wf:Operation Name="GetActivityEvent"/>
<ic:Operation Name="Constant">
<ic:Argument>Closed</ic:Argument>
</ic:Operation>
<ic:Operation Name="Equals"/>
<ic:Operation Name="And"/>
</ic:Expression>
</ic:Filter>
Enfin, cette expression est évaluée comme suit en supposant que GetActivityName a retourné « DessertPolicy » et GetActivityEvent a retourné « Fermé » :
Entrée | Opération | Pile |
---|---|---|
GetActivityName | « DessertPolicy » | |
« FoodAndDrinksPolicy » | Constant | « DessertPolicy », « FoodAndDrinksPolicy » |
Égal à | Comparaison | Faux |
GetActivityEvent | False, « Closed » | |
« Closed » | Constant | False, « Closed », « Closed » |
Égal à | Comparaison | False, True |
And | AND logique | False |
La valeur restante sur la pile est Boolean False
. Cela entraînera le non-déclenchement de l'événement correspondant. Si le nom de l’activité était « FoodAndDrinksPolicy », il aurait été évalué à Boolean True
.
Vous pouvez construire une expression similaire (avec une évaluation similaire) à l’aide des opérations GetEndpointName
WCF et GetOperationName
.
Expressions de données
Les expressions de données permettent de définir une valeur de données de chaîne unique. Une expression de données est toute expression qui n’est pas entourée d’un Filter
élément. Les expressions de données sont utilisées par les OnEvent
éléments CorrelationID
, ContinuationToken
, Reference
et Update
.
Il est courant de devoir mettre à jour la base de données des activités BAM avec un horodatage étiqueté. Par exemple, vous pouvez capturer l’heure à laquelle un événement démarre avec une chaîne au format « Start : <EventTime> ». Pour ce faire, vous devez utiliser une expression semblable à celle qui suit (où + représente une concaténation) :
"Start: " + GetContextProperty(EventTime)
La conversion de ce en RPN donne les résultats suivants :
"Start: " GetContextProperty(EventTime) +
La conversion de cette expression en expression équivalente pour un Update
élément dans le fichier de configuration de l’intercepteur entraîne le code XML suivant :
<ic:Update DataItemName="NewOrderCreateTime" Type="NVARCHAR">
<ic:Expression>
<ic:Operation Name="Constant">
<ic:Argument>Start:</ic:Argument>
</ic:Operation>
<wf:Operation Name="GetContextProperty">
<wf:Argument>EventTime</wf:Argument>
</wf:Operation>
<ic:Operation Name="Concatenate" />
</ic:Expression>
</ic:Update>
Le tableau suivant montre comment cette expression serait interprétée si l'heure de l'événement était minuit (« 12:00 PM »).
Entrée | Opération | Pile |
---|---|---|
« Start: » | Constant | « Start: » |
GetContextProperty(EventTime) | Envoi (push) | « Start: », « 2006-09-27T12:00:34.000Z » |
Concatenate | Concatenate | « Start: 2006-09-27T12:00:34.000Z » |
La valeur utilisée par la commande de mise à jour serait « Start: 2006-09-27T12:00:34.000Z ».
Notes
N'utilisez pas les opérations de comparaison « And » ou « Égal à » dans les expressions de données. Sinon, vous obtenez une erreur lors du déploiement de votre fichier de configuration de l'intercepteur.