上一篇介绍了如何使用跟踪配置文件编辑器收集来自业务流程和管道中的数据集,在本篇中,将通过两种不同的事件流来使用.NET代码产生BAM数据。
将业务流程中的数据写入到BAM中
在这里准备了一个接收订单 - 运输的业务流程,我们将对这个业务流程项目进行配置,把发货人的信息写入到BAM当中。
1. 右键点击OrderProcessing项目并选择添加引用,找到Microsoft.BizTalk.Bam.XLANGs.dll并引用(该文件默认位置在BizTalk安装路径的Tracking文件夹下),打开Shipping业务流程,在接收控件ReceiveShipRequest和发送控件Send_ToChosenShipper之间插入一个表达式控件,并在该控件内写入如下代码。
Microsoft.BizTalk.Bam.EventObservation.OrchestrationEventStream.UpdateActivity
("OrderProcessing",System.String.Concat("Orch_",OrderShipRequest(OrderProcessing.ActivityID)),"Shipper","UPS");2. 在OrderProcessing业务流程当中,添加一个消息赋值的控件将其命名为AssignOrderID并将如下代码添加到表达式中。
ShipRequest(OrderProcessing.ActivityID) = OrderMessage(OrderProcessing.ActivityID);
该表达式的作用是将ActivityID从订单消息中提取到运输请求的消息中。
3. 配置好之后,我们重新生成并部署这个项目,在这里要注意,如果之前你已经部署了该项目,在更新这个项目的同时,你需要重新启动该项目所在的BizTalk主机实例。拿我们这个项目举例来说,上述步骤我已经对项目中的业务流程做了更改,那我需要右键业务流程所在的项目,选择属性,左侧找到部署选项,并将重新启动主机实例设置为True。这样当我们进行部署的时候,会自动为我们重新启动项目所在的主机实例。
在Web service中添加关于BAM的引用
1. 展开OrderProcessing Web service项目,在该项目中添加引用Microsoft.Bam.EventObservation.dll(该文件默认在BizTalk安装路径下的Tracking文件夹下)。添加另一个引用System.Configuration程序集。
2. 打开App_Code文件夹中的OrderProcessing_Ordering_OrderReceivePort.asmx.cs文件,使用如下代码导入我们所需要的类库。
using System; using Microsoft.BizTalk.Bam.EventObservation; using System.Configuration;
在Web service中编写代码向BAM活动传送数据
1. 在WebConfig文件中添加BizTalk MessageBox数据库连接字符串,打开web.config,在AppSettings节点下方添加如下代码
<appSettings> APPLICATION SETTINGS The section is used to configure application-specific configuration settings. These can be fetched from within apps by calling the "ConfigurationSettings.AppSettings(key)" property. --> add key="$Setting.Name{1}quot; value="$Setting.Value{1}quot; /--> <add key="ThrowDetailedError" value="False"/> <add key="WsdlExtension.Enabled" value="False"/> </appSettings> <connectionStrings> <add name="BTSMessageBox" connectionString="database=BiztalkMsgBoxDb;Integrated Security=SSPI"/> </connectionStrings>
2. 在config文件中配置好数据库连接字符串后,我们开始对Web service的后台代码进行修改,通过代码来创建一个向BAM写入数据的过程,其代码如下
//write BAM data Guid bamGuid = Guid.NewGuid(); BufferedEventStream bamStream = new BufferedEventStream( ConfigurationManager.ConnectionStrings["BTSMessageBox"].ConnectionString, 0); bamStream.BeginActivity("OrderProcessing", bamGuid.ToString()); bamStream.UpdateActivity("OrderProcessing", bamGuid.ToString(), "OrderInitiated", DateTime.UtcNow); bamStream.UpdateActivity("OrderProcessing", bamGuid.ToString(), "State", part.ShipTo.StateOrProvince);
3. 使用如下代码建立与BAM活动的通信,完成后关闭该通信并释放BAM流。
bamStream.EnableContinuation("OrderProcessing", bamGuid.ToString(), "Pipe_" + bamGuid.ToString()); bamStream.EndActivity("OrderProcessing", bamGuid.ToString()); bamStream.Flush();
4. 生成一个BAM的GUID,将它作为一个新的参数添加到Invoke方法的最后一个参数,以便管道组件能够在外部获取到该值并且可以将它进行Promote。
// BizTalk invocation this.Invoke("ReceiveOrder", invokeParams, inParamInfos, outParamInfos, 0, bodyTypeAssemblyQualifiedName, inHeaders, inoutHeaders, out inoutHeaderResponses, out outHeaderResponses, null, null, null, out unknownHeaderResponses, true, false, bamGuid.ToString());