65.9K
CodeProject 正在变化。 阅读更多。
Home

BizTalk Server 2006/2009/2010 异常处理开发者指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (13投票s)

2006年3月27日

CPOL

6分钟阅读

viewsIcon

193705

downloadIcon

2707

本文解释了如何在 BizTalk 编排中处理异常。

引言

我们大多数人可能都曾用某种编程语言编写过异常处理代码。在 BizTalk 中,异常处理方式略有不同。本文将解释如何在 BizTalk 中使用端口处理异常和通知机制。

为什么需要处理异常?

考虑以下情况:

  • 当 BizTalk 发送端口无法将消息传输到远程服务器时会发生什么?
  • 有没有一种方法可以在 BizTalk 业务流程中重试事务,或者无限次重试直到远程服务器准备好接收消息?
  • 当发生异常时,有没有一种方法可以优雅地终止业务流程?
  • 如果发生异常,您将如何通过电子邮件通知 BizTalk 管理员?

BizTalk 业务流程中如何处理异常?

异常是指中断正常操作流程的异常情况。

BizTalk 中的作用域形状用于处理异常。BizTalk 业务流程中有两种异常:

  • 异常(常规 .NET 异常)
  • 一般异常

ExceptionScope.JPG

BizTalk 业务流程中的异常使用“作用域”形状进行处理。您必须将所有需要处理异常的逻辑放置在作用域形状内。作用域形状定义了一个异常部分,可以在其中优雅地处理异常。

需要将作用域的事务类型属性设置为“none”。这样可以避免事务的开销,但仍能处理异常。

异常和一般异常有什么区别?

GeneralException.JPG

当我们创建一个新的异常处理程序时,请注意在“异常对象类型”属性中,列表中唯一的项目是“一般异常”。BizTalk 中的一般异常类似于编写 `try`-`catch` 块,但没有异常对象,这意味着无法获取异常对象。一般异常允许 BizTalk 处理它可能捕获和重新抛出的任何异常,但在那一刻无法获取异常消息。

“异常”是派生自 .NET 异常对象的异常。使用此异常对象类型,可以获取 `Exception` 对象及其相应的属性。请注意 `Exception` 类型的“异常对象名称”属性。这在一般异常的情况下将不存在。

异常与传递通知

传递通知是一个属性,用于指示发送端口适配器将把传递通知发送回业务流程,以指示消息已成功传输。

发送端口上的“传递通知”标志表示,如果消息未传输到目的地,业务流程必须收到通知

需要注意的是,传递通知仅在发送端口上的“重试计数”属性设置为 `0` 时才有效。

传递失败异常详情

当消息无法通过 `DeliveryNotification` 属性设置为“`Transmitted`”的发送端口传递时,将引发 `DeliveryFailureException`,并且业务流程需要处理该异常。当您启用传递通知时,业务流程将在消息传输后等待 ACK/NACK 返回。如果返回 ACK,业务流程将完成范围形状并继续处理。如果引擎发回 NACK,则业务流程将引发 `Microsoft.XLANGs.BaseTypes.DeliveryFailureException`,这就是为什么代码需要捕获此类异常的原因。

场景 1:发送销售报告

考虑一个需要将销售报告上传到 Web 服务的场景。

假设

  • 如果 Web 服务没有响应,它将在 24 小时后才能恢复在线。
  • Web 服务端口上的重试计数和间隔设置为“0”。

如果 Web 服务没有响应,将引发异常,并通过将消息发送到 `Offline` 文件夹来处理。

SalesOrchestration




接收形状 - 接收销售报告消息。
作用域形状 - 作用域定义了 BizTalk 中的一个上下文。作用域用于设置 `Transaction` 类型,在此例中,`TransactionType` 设置为“`None`”。作用域的 `Synchronized` 参数设置为“`true`”。
创建了一个销售报告消息,以便将其传输到 Web 服务。
WebPort
注意用“红色”标记的 Web 端口的属性。
传递通知 - 如果消息未能传递到端口,则会生成“`DeliveryFailureException`”。注意:“传递通知”不适用于绑定属性“立即指定”。
此业务流程处理两种异常。
  • DeliveryFailure 异常
  • 一般异常
一般异常 - 在这种情况下,需要发送到 Web 服务的消息被写入脱机文件夹。
重要提示:`DeliveryFailure` 异常 - 在此场景中不会抛出此异常,因为 Web 服务端口是请求-响应端口。这就是为什么在一般异常部分处理异常的原因。

事件日志消息...

观察事件日志消息...

EvtLogSales

场景 2:使用虚拟文件夹引发“DeliveryFailureException”

在此场景中,当需要传输消息时,我们创建了一个“Dummy”文件夹,由于该Dummy文件夹不存在,我们处理异常并将消息发送到`Offline`文件夹。

NotificationOrchestration




接收形状 - 接收销售报告消息。
创建了一个销售报告消息,以便将其传输到 Web 服务。
作用域形状 - 作用域定义了 BizTalk 中的一个上下文。作用域用于设置事务类型,在此例中,`TransactionType` 设置为“`None`”。作用域的 `Synchronized` 参数设置为“`true`”。
DummyPort
注意用“红色”标记的 `ReportDummyPort` 的属性。
传递通知 - 如果消息未能传递到端口,则会生成“`DeliveryFailureException`”。请注意,“传递通知”不适用于绑定属性“立即指定”。
此业务流程处理两种异常。
  • DeliveryFailure 异常
  • 一般异常
由于虚拟端口中指定的文件路径不存在,因此端口会引发 `DeliveryFailure` 异常。异常处理程序通过将消息发送到 `OfflineFolder` 来处理异常。请注意,在这种情况下,`DeliveryFailure` 异常已正确引发。

事件日志消息

观察事件日志消息

EvtLogNotification

关于可下载代码

  • 将 Web 服务及其文件夹名称解压到 C:\inetput\wwwroot 目录中,然后设置 Web 服务。
    注意 - 将 Persist.asmx 重命名为 Persist2.asmx,使其不可用。
  • 将 BizTalk 项目 zip 文件及其文件夹名称解压到 C:\ 驱动器中。
  • KeyAndBindings 文件夹包含 Bindings.xml 文件,可在解决方案构建和部署后导入。
  • SalesMessage 放置在 In 文件夹中,并检查 Offline 文件夹。

一些要点

  1. 如果您想处理 `exceptions`,请将 `Scope` 形状上的 `Synchronized` 属性设置为 `true`。
  2. 在业务流程中创建“Web 端口”时,始终选择添加到项目中的“Web 引用”所创建的“WebPortType”。
  3. 提前绑定端口不支持传递通知。建议不要使用提前绑定端口。仅将提前绑定端口用于学习和培训目的。

参考资料 - 不要错过这些精彩的帖子

  1. 确认和否定确认(第一部分)
  2. BizTalk 2004 交付通知和 NACK 示例
© . All rights reserved.