本主題描述如何使用金鑰 BAM API 類別來檢測應用程式。 在下列代碼段中,我們已使用常數,以及使用檢測應用程式所需的最低程式代碼來簡化範例程序代碼。
下列代碼段示範如何建立新的 Microsoft.BizTalk.Bam.EventObservation.EventStream 物件,特別是 Microsoft.BizTalk.Bam.EventObservation.DirectEventStream。 在此代碼段中,第一個參數會指定 BAM 主要匯入資料庫資料存放區的連接字串,而第二個參數會指定事件寫入數據存放區的頻率。
備註
BAM 僅支持連線到 SQL Server 資料存放區。 範例連接字串代表建立連接所需的最小連接字串。 您的設定可能需要在連接字串中指定其他參數。
FlushThreshold 值為 0 指定不會自動寫入事件,而且您必須呼叫 Flush 方法來寫入事件。 一的值會導致每次事件發生時立即記錄該事件。 大於一個的值會指定發生指定累積批次時寫入事件。 使用大於一的值有助於提升效能。
// Specify the DES connection string.
const string connBAMPIT =
"Integrated Security=SSPI;server=.;database=BAMPrimaryImport";
// Write the activity update data on every call.
int flushThreshold = 1;
// Create a DES instance
EventStream es =
new DirectEventStream(connBAMPIT, flushThreshold);
建立 [Microsoft.BizTalk.Bam.EventObservation.EventStream]/dotnet/api/microsoft.biztalk.bam.eventobservation.eventstream) 對象之後,您就可以開始活動,並使用收集的里程碑和數據開始更新活動數據表。 部署 BAM 活動時,會在 BAM 主要匯入資料庫中建立五個數據表。 如需開發程式的詳細資訊,請參閱 BAM 開發程式概觀。
呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法會將記錄新增至bam_ PurchaseOrder_Activity數據表。 第一個參數包含要更新的活動名稱,而第二個參數則包含活動實例的標識碼。 標識元可以是任何字串,但它在活動的記錄集中必須是唯一的。
此時,記錄不包含任何數據。 Microsoft.BizTalk.Bam.EventObservation.EventStream.UpdateActivity 方法會使用擷取的事件數據來更新記錄。 再次指定活動和活動實例標識碼。 您可以傳遞 Microsoft.BizTalk.Bam.EventObservation.EventStream.UpdateActivity 方法名稱值組的數據項和活動中所定義的里程碑。 例如,我們的活動定義了里程碑MS_Received。 部署活動時,會在bam_PurchaseOrder_Activity表中為里程碑創建一個欄位。 Microsoft.BizTalk.Bam.EventObservation.EventStream.UpdateActivity 方法的呼叫會指定MS_Received和 DateTime.UtcNow 的名稱值組,以使用已接收的採購單日期來更新活動。
// When a purchase order is received, you call the
// BeginActivity method in the receive application.
// You can then capture the event data by calling
// the UpdateActivity method.
es.BeginActivity ("PurchaseOrder", "PO123");
es.UpdateActivity ("PurchaseOrder", "PO123",
"MS_Received", DateTime.UtcNow,
"T_Customer", "Joe");
在此範例中,我們會繼續執行第二個活動。 如需接續的詳細資訊,請參閱 活動接續。
若要讓其他已裝設儀表的應用程式能夠更新 PurchaseOrder 活動,您可以呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法。 呼叫會指定其他應用程式可以參與的活動、所追蹤之活動的實例標識碼,以及其他應用程式將用來更新活動的接續令牌。 記錄會被寫入 bam_ PurchaseOrder_continuations 資料表,以追蹤接續的狀態。 當此活動擴展到其他程序時,系統會針對每次呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法(具有唯一的接續標記)寫入記錄。
這很重要
接續案例中的每個程式代碼區段都必須有自己的 Microsoft.BizTalk.Bam.EventObservation.EventStream.EndActivity 方法呼叫。 若未能這樣做,將導致殘留或孤立的活動記錄。
不過,只有第一個區段(使用實際活動標識符)具有 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法:所有其他區段(使用自己的唯一令牌標識符)不得呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法。
呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法之後,其他元件可以使用指定接續令牌而非活動標識符的 Microsoft.BizTalk.Bam.EventObservation.EventStream.UpdateActivity 來更新採購單活動。 當其他元件完成其工作時,每個元件都必須使用接續令牌呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EndActivity ,以通知 BAM 基礎結構不會再發生任何事件。
這很重要
一旦呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法之後,如果繼續活動的過程從未使用接續令牌呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EndActivity 方法,則該活動可能會變成孤兒。
// Continue the activity to the next process that has been
// instrumented to handle the continuation.
es.EnableContinuation("PurchaseOrder", “PO123”, “AP123”);
最後,藉由呼叫指定活動名稱和活動標識符的 Microsoft.BizTalk.Bam.EventObservation.EventStream.EndActivity 方法來完成活動。 如果沒有未完成的接續,活動會移至 bam_ PurchaseOrder _completed 數據表。 如果接續活動無法完成,活動可能會變成孤立。
// Activity from this segment (PO submission) is completed
es.EndActivity("PurchaseOrder", “PO123”);
當活動繼續個別處理時,應用程式會藉由呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.UpdateActivity 來檢測以更新活動數據表,並指定 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法呼叫中所宣告的活動名稱和接續令牌。
備註
處理繼續活動的進程不會呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法。 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法會藉由在 BAM 主要匯入資料庫中建立數據表來建立活動的實例。 已存在活動的實例正在被更新,以便活動流程能夠繼續進行。
// update when the order is approved
es.UpdateActivity ("PurchaseOrder", “AP123”, "MS_Approved",
DateTime.UtcNow, "T_Product", "Widget");
// update when the product is ready for shipment
es.UpdateActivity ("PurchaseOrder", “AP123”,
"MS_Ready", DateTime.UtcNow);
此範例的工作流程的一部分,程式代碼會指定參考,在此案例中為特定類型的參考 - 相關活動。 藉由指定相關活動,您會從主要活動建立連結至其他感興趣的活動,讓使用者在 BAM 入口網站中檢視活動。
呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.AddRelatedActivity 方法會將一筆記錄寫入 bam_PurchaseOrder_ActiveRelationships,以連結這些活動。
// These are shipped in two shipments.
// Relates the current purchase order
// instance to two shippings.
// Note: only one direction
es.AddRelatedActivity ("PurchaseOrder", “AP123”,
"Shipping", “UPS101”);
es.AddRelatedActivity ("PurchaseOrder", “AP123”,
"Shipping", “UPS102”);
若要結束持續的活動,請呼叫 Microsoft.BizTalk.Bam.EventObservation.EventStream.EndActivity 方法,並指定即將結束的活動的延續權杖。 如果沒有其他未完成的接續,則採購單活動會移至已完成的數據表。
// Activity from this segment (ApprovalProcess) is completed
es.EndActivity("PurchaseOrder", “AP123”);
完整程式代碼範例
//---------------------------------------------------------------------
// File:BAMMinimalSample.cs
//
// Summary: Demonstrates how to instrument an application
//using BAM APIs to track useful information.
//
// Sample: BAM Api Sample
//
//---------------------------------------------------------------------
// This file is part of the Microsoft BizTalk Server SDK
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// This source code is intended only as a supplement to Microsoft
// BizTalk Server release and/or on-line documentation. See
// these other materials for detailed information regarding Microsoft // code samples.
//
// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//---------------------------------------------------------------------
// This sample requires that you add the
// Microsoft.BizTalk.Bam.EventObservation.dll to the
// references in the Visual Studio Solution.
using System;
using System.Text;
using Microsoft.BizTalk.Bam.EventObservation;
namespace EventStreamSample
{
static void Main(string[] args)
{
//
// The following code would appear in a purchase order
// receipt application.
//
// Specify the DES connection string.
const string connBAMPIT =
"Integrated Security=SSPI;server=.;database=BAMPrimaryImport";
// Write the activity update data on every call.
int flushThreshold = 1;
// Create an instance of the DirectEventStream.
EventStream es =
new DirectEventStream(connBAMPIT, flushThreshold);
// When a purchase order is received, you call the
// BeginActivity method in the receive application.
// You can then capture the event data by calling
// the UpdateActivity method.
es.BeginActivity ("PurchaseOrder", "PO123");
es.UpdateActivity ("PurchaseOrder", "PO123",
"MS_Received", DateTime.UtcNow,
"T_Customer", "Joe");
// Continue the activity to the next process that has been
// instrumented to handle the continuation.
es.EnableContinuation("PurchaseOrder", “PO123”, “AP123”);
// Activity from this segment (PO submission) is completed
// end activity is synonymous to IsCompleted = 1
es.EndActivity("PurchaseOrder", “PO123”);
//
// The following code would typically appear in a separate
// application that monitors the approval process
// (ApprovalProcess.exe)
//
// update when the order is approved
es.UpdateActivity ("PurchaseOrder", “AP123”, "MS_Approved",
DateTime.UtcNow, "T_Product", "Widget");
// update when the product is ready for shipment
es.UpdateActivity ("PurchaseOrder", “AP123”,
"MS_Ready", DateTime.UtcNow);
// These are shipped in two shipments.
// Relates the current purchase order
// instance to two shippings.
// Note: only one direction
es.AddRelatedActivity ("PurchaseOrder", “AP123”,
"Shipping", “UPS101”);
es.AddRelatedActivity ("PurchaseOrder", “AP123”,
"Shipping", “UPS102”);
// Activity from this segment (ApprovalProcess) is completed
es.EndActivity("PurchaseOrder", “AP123”);
// In another Shipping application, two shipments with
ID’s UPS101 and UPS102 will be created.
}
}