检测解决方案:分步 API 用法
本主题说明如何用关键的 BAM API 类检测应用程序。 在以下代码段中,我们使用常量和检测应用程序所必需的最少代码对示例代码进行了简化。
以下代码段演示如何创建新的 Microsoft.BizTalk.Bam.EventObservation.EventStream 对象,尤其是 Microsoft.BizTalk.Bam.EventObservation.DirectEventStream。 在此代码段中,第一个参数指定 BAM 主导入数据库数据存储区的连接字符串,第二个参数指定事件写入数据存储区的频率。
注意
BAM 仅支持与SQL Server数据存储的连接。 该示例连接字符串代表建立连接所需的最小连接字符串。 您的配置可能要求在连接字符串中指定其他参数。
如果 FlushThreshold 值为 0,则指定事件不会自动写入,你必须调用 Flush 方法来写入事件。 如果值为 1,则各事件在发生时即被写入。 如果值大于 1,则指定在发生的事件数量达到指定的批次累计数量时,写入这些事件。 使用大于 1 的值有助于提高性能。
// 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 主导入数据库中创建五个表。 有关开发过程的详细信息,请参阅 Overview of the BAM Development Process。
调用 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");
在此示例中,我们继续执行第二个活动。 有关继续的详细信息,请参阅 Activity Continuation。
若要启用其他被检测的应用程序来更新 PurchaseOrder 活动,可包含一个对 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法的调用。 此调用指定其他应用程序可参与的活动、被跟踪活动实例的标识符以及其他应用程序用于更新活动的继续符。 将在 bam_ PurchaseOrder_continuations 表中写入一条记录,以跟踪继续符的状态。 如果活动继续执行其他进程,则使用唯一的继续标记为 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法的每次调用写入一条记录。
重要
继续方案中的每个代码段必须有自己的 Microsoft.BizTalk.Bam.EventObservation.EventStream.EndActivity 方法调用。 否则将导致虚的/孤立的活动记录。
但是,只有(使用实际活动 ID 的)第一个段具有 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法;(使用各自唯一标记 ID 的)所有其他段均不得调用 Microsoft.BizTalk.Bam.EventObservation.EventStream.BeginActivity 方法。
调用 Microsoft.BizTalk.Bam.EventObservation.EventStream.EnableContinuation 方法后,其他组件可以使用指定继续标记而非活动 ID 的 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.
}
}