培训
使用活动
使用 BAM 的最简单的方式是使用 BAM API 发送显式里程碑或数据。 您可以将 BAM 活动看作 SQL 表中与实际工作单位保持同步的记录。
为每个新工作单元调用
BeginActivity
。当工作完成并且你不希望在此工作单元的上下文中出现更多事件时调用
EndActivity
。在实现的关键位置调用 Microsoft.BizTalk.Bam.EventObservation.EventStream.UpdateActivity ,以发送对信息工作者有用的数据和里程碑。
重要
事件流在释放前必须刷新。 在释放 EventStream 对象时,不会执行自动刷新数据的操作。 通常情况下您编写的代码只在已处理完活动后才刷新事件流,这意味着如果在调用刷新操作之前发生了异常,则可能导致数据丢失。
为了避免数据丢失,建议您将处理过程和刷新操作封装在 try/finally 块中,如下面的伪代码所示:
BufferedEventStream es = new BufferedEventStream(…)
Try
{
// Do the activity processing here.
}
Finally
{
if (es != null ) es.Flush();
}
下面的示例代码显示了当工作单位为采购订单时如何使用 BeginActivity、UpdateActivity 和 EndActivity。 在此示例中,我们假定字符串变量 poid 标识正在处理的当前采购订单:
using Microsoft.BizTalk.BAM.EventObservation;
...
EventStream es=new DirectEventStream(connectionString,1);
...
// At the beginning of the processing of a new work:
// Here poid is a string variable that has the current
// Purchase Order identifier (e.g. PO number)
es.BeginActivity("PurchaseOrder",poid);
es.UpdateActivity("PurchaseOrder",poid,
"POReceived",DateTime.UtcNow,
"POAmount",100,
"CustomerName",""Joe",
"CustomerCity","Seattle");
...
// few days later
es.UpdateActivity("PurchaseOrder",poid,
"POApproved",DateTime.UtcNow,
"ProductName","Widget");
...
// and another few days later
es. UpdateActivity("PurchaseOrder",poid,
"POShipped",DateTime.UtcNow);
...
// and finally
es. UpdateActivity("PurchaseOrder",poid,
"Delivered",DateTime.UtcNow);
es.EndActivity("PurchaseOrder",poid);