BAM 攔截器組態檔會使用篩選運算式來識別活動,並使用日期運算式來建構用於儲存體的資料元素、做為相互關聯識別碼或接續權杖或類似用途。 不論用途為何,個別運算式都會由 expression 元素識別在攔截器組態檔中,並使用反向波蘭文標記法包含一或多個作業,也稱為後置標記法。
關於 Reverse Polish Notation
在 Reverse Polish Notation (RPN) 中,運算元優先於運算子,因此不需要使用括號做為優先順序運算子。 堆疊是用來保留值和所有作業,包括將值推入堆疊、顯示 (移除) 來自堆疊的值,或是執行推入和顯示的組合動作來完成作業。
例如,如果您要評估運算式
5 + (10 - 2)
將此運算式轉換成同等的 RPN 會得出
5 10 2 - +
評估結果如下:
| 輸入 | 作業 | Stack |
|---|---|---|
| 5 | 推送 | 5 |
| 10 | 推送 | 5、10 |
| 2 | 推送 | 5, 10, 2 |
| - | 減去 | 5, 8 |
| + | 加 | 13 |
假如 RPN 系統支援字串串連作業,那麼您也可以評估運算式
"The quick brown " + "fox " + "jumped over the lazy " + "dog."
將此運算式轉換成同等的 RPN 標記法會產生:
"The quick brown " "fox " "jumped over the lazy " "dog" + + +
評估結果如下:
| 輸入 | 作業 | Stack |
|---|---|---|
| "The quick brown" | 推送 | 「快速棕色 」 |
| "fox" | 推送 | "The quick brown ", "fox " |
| "jumped over the lazy" | 推送 | "The quick brown ", "fox ", "jumped over the lazy " |
| "dog." | 推送 | "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." |
如您所見,任意數目的作業都可支援,包括比較、布林值作業,以及擷取適合本身所參與作業之值的自訂作業。 值會在堆疊上累積,並且根據個別作業推入和顯示。
攔截器組態檔中的 Reverse Polish Notation
您將在攔截器組態檔中撰寫兩種運算式:篩選運算式和日期運算式。 篩選運算式預期 RPN 運算式的結果為布林值 true ,或 false 日期運算式預期堆疊上的單一值。
篩選運算式
篩選運算式會評估為 Boolean true 或 false ,並用來識別在 WF 或 WFC 應用程式中追蹤的特定事件。 在 WF 應用程式中,通常會根據活動名稱或事件進行篩選。 例如,您可能會想要在 [關閉] 時選取FoodAndDrinksPolicy活動。 若使用 WF 作業,您就可以表示篩選條件,如下所示:
(GetActivityName = "FoodAndDrinksPolicy") && (GetActivityEvent = "Closed")
將此運算式轉換成 RPN 會產生:
GetActivityName "FoodAndDrinksPolicy" == GetActivityEvent "Closed" == &&
將此運算式轉換成適用攔截器組態檔的同等運算式,會得出下列 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>
最後,假設 GetActivityName 傳回 「一般」,而 GetActivityEvent 傳回 「Closed」,則會評估此運算式:
| 輸入 | 作業 | Stack |
|---|---|---|
| GetActivityName | "DessertPolicy" | |
| "FoodAndDrinksPolicy" | 常數 | "DessertPolicy", "FoodAndDrinksPolicy" |
| Equals | 比較 | False |
| GetActivityEvent | False, Closed | |
| "Closed" | 常數 | False, "Closed", "Closed" |
| Equals | 比較 | False, True |
| 和 | 邏輯 And | False |
堆疊上剩餘的值是布林值 False 。 這樣將不會引發對應的事件。 如果活動名稱為 「FoodAndDrinksPolicy」,則會評估為布林值 True 。
您可以使用 WCF 作業 GetEndpointName 和 GetOperationName ,透過類似的評估) 來建構類似的運算式 (。
資料運算式
資料運算式是用來定義單一字串資料值。 日期運算式是專案未括住 Filter 的任何運算式。 專案 、、 和 會使用 OnEventCorrelationID 日期運算式。 UpdateReferenceContinuationToken
BAM 活動資料庫通常必須更新並且標示時間戳記。 例如,您可能想要擷取事件開頭的字串格式為 「Start: < EventTime > 」 的時間。 若要執行這項操作,您必須使用類似下方的運算式 (其中 + 代表串連):
"Start: " + GetContextProperty(EventTime)
將此運算式轉換成 RPN 會產生:
"Start: " GetContextProperty(EventTime) +
將這個運算式轉換為攔截器組態檔中元素 Update 的對等運算式會產生下列 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>
下表說明事件時間為 "12:00 PM" 時,如何解譯此運算式。
| 輸入 | 作業 | Stack |
|---|---|---|
| 「Start: 」 | 常數 | 「Start: 」 |
| GetContextProperty(EventTime) | 推送 | 「Start: 」, 「, 」2006-09-27T12:00:34.000Z」 |
| Concatenate | Concatenate | 「Start: 2006-09-27T12:00:34.000Z」 |
update 命令所使用的值會是 「Start: 2006-09-27T12:00:34.000Z」。
注意
請不要在資料運算式中使用比較作業 "And" 或 "Equals"。 如果您使用比較作業的話,將在部署攔截器組態檔時收到錯誤。