传入消息的自定义确认

Custom Acknowledgement for Incoming Messages

我不确定我这样做是否正确。

我们的编排看起来像这样:

ReceiveOrder
TryScope (Long Running)
   AcknowledgementScope (Atomic)
     ConstructOrderAckMessage
        TransformOrderToAck (using a map)
     SendOrderAckToMessageQueue
   AtomicWebServiceScope
      ImportOrderToDBExpression
   Construct and send message to another process
CatchException
      ConstructErrorExpression
      HandleExceptionStartOrchestration

当我们用大约 6000 个订单对此进行测试时,我们注意到所有订单都会产生一条确认消息 (SendOrderAckToMessageQueue)。确认是一个简单的 XML,基于将订单发送到此编排的工作人员提供的模式。

然而,并不是所有的都被导入到数据库中(ImportOrderToDBExpression)(大约 45 个)。事实上,没有任何类型的错误或失败或挂起的实例。没有导入的订单没有什么异常。如果它失败了,它会默默地这样做。

请注意,AcknowledgementScope 部分是最近添加的;在此之前,所有订单都已成功导入。

这是因为我在这个编排中设置的范围不正确吗?问题还可能出在哪里?有没有更好的方法以万无一失的方式发送确认?感谢您的任何建议。

您没有提到任何 Catch 块。你的所有示波器上都有 Catch 块吗?

如果有没有 Catch 块的异常或没有记录异常的 Catch 块,它将看似无声地失败。

是的,你做错的主要是调用外部 DLL 将记录插入数据库。

除非 DLL 编写得非常好以支持多线程(包括限制并发连接数)并且具有良好的重试和错误处理能力,否则它可能会遇到错误并静默失败。

即使您确实将 DLL 中的错误记录到事件日志中,您也必须授予 DLL 用于写入事件日志的应用程序名称的权限,否则 DLL 将无法捕获阻止尝试写入事件日志。

您应该做的是使用带有适当适配器的发送端口将记录发送到数据库。

另外,在极少数情况下您需要原子作用域。对于原子作用域,由开发人员实施任何回滚。此外,您可能不需要很长的 运行 范围,除非您希望您的 Orchestration 需要很长时间并且在等待响应时应该脱水。

在 BizTalk Orchestration 收到消息后发送确认是可以的,只要您随后可以以某种方式在 BizTalk 中恢复失败的消息,因此您需要某种重试机制。