Biztalk 传入消息的自定义确认

Biztalk 传入消息的自定义确认,biztalk,biztalk-2013,Biztalk,Biztalk 2013,我不确定我是否做对了 我们的编排如下所示: ReceiveOrder TryScope (Long Running) AcknowledgementScope (Atomic) ConstructOrderAckMessage TransformOrderToAck (using a map) SendOrderAckToMessageQueue AtomicWebServiceScope ImportOrderToDBExpressi

我不确定我是否做对了

我们的编排如下所示:

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块的异常或Catch块没有记录该异常,它将显示为静默失败。

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

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

即使在将DLL中的错误记录到事件日志中时,也必须为DLL用于写入事件日志的应用程序名授予权限,否则DLL将在尝试写入事件日志的捕获块中失败

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

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


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

是的,您的主要错误是调用外部DLL将记录插入数据库

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

即使在将DLL中的错误记录到事件日志中时,也必须为DLL用于写入事件日志的应用程序名授予权限,否则DLL将在尝试写入事件日志的捕获块中失败

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

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


在BizTalk业务流程收到消息后发送确认是可以的,只要您可以在BizTalk中以某种方式恢复失败的消息,那么您需要某种重试机制。

InportOderToDBExpression是如何完成的?这是通过发送端口发送的,还是您正在代码中执行某些操作?此外,您在执行插入之前似乎正在发送Ack消息。还有,为什么要使用原子作用域?谢谢@Dijkgraaf导入程序是使用从BizTalk应用程序项目引用的.DLL调用的SP完成的。不涉及发送端口。这一切都是通过该表达式中的代码完成的。要求是在收到传入消息后立即发送确认。原子作用域没有具体的原因。当您遇到多线程和错误处理问题时,通过调用DLL来发送消息是相当糟糕的做法。如果引用的DLL没有正确地处理其中任何一个,您将得到确切的情况,并且不会看到任何错误,因为它们没有被冒泡备份。我建议使用发送端口和正确的适配器进行连接,因为它内置了这些功能。您的DLL可能试图将错误记录到事件日志中,但它可能没有权限,因此即使这样也会失败。InportOderToDBExpression是如何完成的?这是通过发送端口发送的,还是您正在代码中执行某些操作?此外,您在执行插入之前似乎正在发送Ack消息。还有,为什么要使用原子作用域?谢谢@Dijkgraaf导入程序是使用从BizTalk应用程序项目引用的.DLL调用的SP完成的。不涉及发送端口。这一切都是通过该表达式中的代码完成的。要求是在收到传入消息后立即发送确认。原子作用域没有具体的原因。当您遇到多线程和错误处理问题时,通过调用DLL来发送消息是相当糟糕的做法。如果引用的DLL没有正确地处理其中任何一个,您将得到确切的情况,并且不会看到任何错误,因为它们没有被冒泡备份。我建议使用发送端口和