传入消息的自定义确认
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 中恢复失败的消息,因此您需要某种重试机制。
我不确定我这样做是否正确。
我们的编排看起来像这样:
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 中恢复失败的消息,因此您需要某种重试机制。