Expresiones de configuración de interceptor
El archivo de configuración del interceptor de BAM usa expresiones de filtro para identificar una actividad y usa expresiones de datos para construir un elemento de datos para el almacenamiento, usar como identificador de correlación o token de continuación, o un propósito similar. Independientemente del propósito, las expresiones individuales se identifican en el archivo de configuración del interceptor por el expression
elemento y contienen una o varias operaciones mediante notación de polaco inverso, también conocida como notación postfijo.
Acerca de la Notación polaca inversa
En la Notación polaca inversa (RPN), los operandos preceden al operador, con lo que se elimina la necesidad de usar paréntesis como operadores de precedencia. Una pila se usa para contener valores y todas las operaciones, tanto valores de insertar en la pila como de retirar (quitar) de la pila, o para realizar una combinación de insertar y retirar para completar una operación.
Por ejemplo, si deseara evaluar la expresión
5 + (10 - 2)
Convertir esto a los resultados RPN equivalentes en
5 10 2 - +
Esto se evaluaría de la siguiente forma:
Entrada | Operación | Pila |
---|---|---|
5 | Insertar | 5 |
10 | Insertar | 5, 10 |
2 | Insertar | 5, 10, 2 |
- | Restar | 5, 8 |
+ | Sumar | 13 |
Suponiendo que el sistema RPN admitiera la operación de concatenación de cadenas, podría también evaluar la expresión
"The quick brown " + "fox " + "jumped over the lazy " + "dog."
Convertir esto al rendimiento de notación de RPN equivalente:
"The quick brown " "fox " "jumped over the lazy " "dog" + + +
Esto se evaluaría de la siguiente forma:
Entrada | Operación | Pila |
---|---|---|
"El marrón rápido" | Insertar | "The quick brown " |
"fox" | Insertar | "The quick brown ", "fox " |
"jumped over the lazy" | Insertar | "The quick brown ", "fox ", "jumped over the lazy " |
"dog." | Insertar | "The quick brown ", "fox ", "jumped over the lazy ", "dog." |
+ | Concatenate | "The quick brown ", "fox ", "jumped over the lazy dog." |
+ | Concatenate | "The quick brown ", "fox jumped over the lazy dog." |
+ | Concatenate | "The quick brown fox jumped over the lazy dog." |
Como puede ver, se admite un número arbitrario de operaciones, incluidas la comparación, las operaciones booleanas y las operaciones personalizadas que recuperan valores apropiados para las operaciones en las que participan. Los valores se acumulan en la pila y se insertan y quitan en función de las operaciones individuales.
Notación polaca inversa en el archivo de configuración de interceptor
Escribirá dos tipos de expresiones en el archivo de configuración del interceptor: expresiones de filtro y expresiones de datos. Las expresiones de filtro esperan que el resultado de la expresión RPN sea booleano true
o false
mientras que las expresiones de datos esperan un valor único en la pila.
Expresiones de filtro
Las expresiones de filtro se evalúan como booleanas true
o false
y se usan para identificar un evento específico para realizar un seguimiento en la aplicación WF o WFC. En aplicaciones WF, es común filtrar en función del nombre de la actividad y del evento. Por ejemplo, puede que desee seleccionar la actividad FoodAndDrinksPolicy cuando esté cerrada. Mediante el uso de operaciones de WF, puede expresar el filtro como:
(GetActivityName = "FoodAndDrinksPolicy") && (GetActivityEvent = "Closed")
Convertir en rendimiento de RPN:
GetActivityName "FoodAndDrinksPolicy" == GetActivityEvent "Closed" == &&
La conversión de esta expresión a la expresión equivalente para el archivo de configuración de interceptor da como resultado el siguiente XML:
<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>
Por último, esta expresión se evaluaría como se indica a continuación, suponiendo que GetActivityName devolvió "DessertPolicy" y GetActivityEvent devolvió "Closed":
Entrada | Operación | Pila |
---|---|---|
GetActivityName | "DessertPolicy" | |
"FoodAndDrinksPolicy" | Constante | "DessertPolicy", "FoodAndDrinksPolicy" |
Equals | De comparación | False |
GetActivityEvent (operación) | False, Closed | |
"Closed" | Constante | False, "Closed", "Closed" |
Equals | De comparación | False, True |
And | Logical And | False |
El valor izquierdo de la pila es Boolean False
. Esto provocará que el evento correspondiente no se active. Si el nombre de la actividad fuera "FoodAndDrinksPolicy", se habría evaluado como booleano True
.
Puede construir una expresión similar (con una evaluación similar) mediante las operaciones GetEndpointName
de WCF y GetOperationName
.
Expresiones de datos
Las expresiones de datos se usan para definir un único valor de datos de cadena. Una expresión de datos es cualquier expresión que no esté incluida en un Filter
elemento. Las expresiones de datos las usan los OnEvent
elementos CorrelationID
, ContinuationToken
, Reference
y Update
.
Un requisito habitual suele ser actualizar la base de datos de actividad de BAM con una marca de tiempo sin etiqueta. Por ejemplo, es posible que quiera capturar la hora en que un evento comienza con una cadena con el formato "Start: <EventTime>". Para hacerlo, debe usar una expresión similar a la siguiente (donde + representa la concatenación):
"Start: " + GetContextProperty(EventTime)
Convertir en rendimiento de RPN:
"Start: " GetContextProperty(EventTime) +
Convertir esta expresión en la expresión equivalente para un Update
elemento del archivo de configuración del interceptor da como resultado el siguiente XML:
<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>
La siguiente tabla muestra cómo debe interpretarse esta expresión si la hora del evento fuera "12:00 PM".
Entrada | Operación | Pila |
---|---|---|
"Start: " | Constante | "Start: " |
GetContextProperty(EventTime) | Insertar | "Start: ", "2006-09-27T12:00:34.000Z" |
Concatenate | Concatenate | "Inicio: 2006-09-27T12:00:34.000Z" |
El valor usado por el comando update sería "Start: 2006-09-27T12:00:34.000Z".
Nota
No use las operaciones de comparación "And" o "Equals" en expresiones de datos. De hacerlo, recibirá un error cuando implemente el archivo de configuración de interceptor.