概述
BAM 侦听器是一个对象,可用于检测应用程序以捕获感兴趣的数据。 下图显示了 BAM 侦听器的角色及其与其他 BAM 组件的交互:
BAM 侦听器
在应用程序的每一个步骤中,当您可能具有与您关注相关的数据时,调用 Interceptor OnStep,提供步骤的标识符,并提供应用程序中正在使用的某些数据或任意对象。
必须实现回调函数,以便在回调发生时,回调过程将获取当前步骤 ID 和数据对象。 从本质上讲,BAM 拦截器只是将数据对象传递到回调。 提取数据的实际逻辑驻留在应用程序中。 例如,如果数据采用 XML 消息的形式,则回调将使用 XPaths。 有关 XPath 的详细信息,请参阅 在消息分配中使用 XPaths。
BAM 拦截器根据可以以编程方式创建的配置来决定在每个步骤中请求哪些数据。 然后,BAM 侦听器使用获取的数据来调用 DirectEventStream 或 BufferedEventStream,你需要保留并每次作为参数传递给 OnStep。
为每个步骤调用侦听器不是资源密集型作。 如果调用且未注册此步骤,则侦听器将立即返回。 这意味着没有磁盘作,没有事务,甚至没有内存分配,因此几乎没有性能影响。 同时,可以根据需要提取 BAM 的任何数据。 对涉及数据提取和数据可用性的步骤的性能影响将取决于您对IBAMDataExtractor Interface
的实现。
以下代码示例演示了在配置和运行时使用侦听器。
配置时间
以下代码演示如何将拦截器配置为在应用程序执行到 recvPO 步骤时停止,并请求客户名称和客户社会安全号码:
ActivityInterceptorConfiguration cfg= new ActivityInterceptorConfiguration ("PurchaseOrder");
...
cfg.RegisterDataExtraction("CustomerName",recvPO,XpathName);
cfg.RegisterDataExtraction("CustomerSSN",recvPO,XpathSSN);
...
BAMInterceptor interceptor=new BAMInterceptor();
cfg.UpdateInterceptor(interceptor);
...
// The interceptor instance is ready.
创建拦截器实例后,可以存储它以供稍后在运行时使用。
可以保留不同的预先创建的侦听器,这些侦听器代表用于 BAM 的数据和里程碑的不同首选项。 为了获得最佳性能,请使用 BinaryFormatter 类序列化侦听器实例。
运行时
使用此代码在生产环境运行时启用拦截器:
// Deserialize the Interceptor that was prepared before
...
es=new DirectEventStream(...)
...
Interceptor.OnStep(recvPO, data1, es, callback)
...
Interceptor.OnStep(approvePO, data2, es, callback)
...
地点:
recvPO 和 approvePO 是用于标识应用程序中步骤的任意对象。
data1 和 data2 是你当时拥有的任意对象,可能包含有趣的数据,例如采购订单的 XML 文档。
es 是 DirectEventStream 或 BufferedEvent 流,具体取决于性能要求。
回调 是你的
IBAMDataExtractor Interface
实现 。SDK 示例 BAM API (BizTalk Server 示例)演示了如何使用侦听器,该侦听器包含配置工具和示例运行时应用程序。
BizTalk 业务流程引擎支持拦截,这允许使用跟踪配置文件编辑器更改在运行时为 BAM 收集的数据。