0

我有一个第 3 方 DLL 的问题,它不是线程安全的,但我需要在业务流程中调用它。

我正在表达式形状内进行 DLL 调用。在许多不同的业务流程中调用相同的 DLL。

我遇到的问题是,对于一系列传入消息,BizTalk 将并行运行多个业务流程(或业务流程的多个实例)——这会导致 DLL 中出现异常。

考虑到重构 DLL 不是一种选择,有什么办法可以解决这个问题。或者,有没有办法限制 BizTalk 在任何时候只运行一个业务流程。(我见过一些将工作池限制为处理器数量的黑客行为,但这似乎没有帮助。我们不能降级到单核机器!)

我宁愿找到一种让 DLL 满意的方法(尽管我想不出如何)而不是限制 BizTalk - 但是如果有一种方法可以限制,那将是一个可接受的短期解决方案,同时我们与第 3 方讨论。(谁是一个大组织,真的应该知道得更好!)

4

1 回答 1

1

即使在单核机器上,BizTalk 也会运行并发编排。

您可以通过在编排中实现单例模式来限制编排。

为此,您可以在编排中创建一个循环并具有两个接收形状,一个在循环开始之前,一个在循环内部。

这两个接收都绑定到相同的入站逻辑端口。

您创建一个关联集,指定类似 BTS.MessageType 之类的内容,并设置第一个接收形状以启动关联,并设置第二个接收以跟随关联。

只要循环没有结束,您就可以保证某种类型的任何消息将始终由同一编排实例处理。

然而,使用单例是一个带有缺点的设计决策。例如,吞吐量受到影响,您必须确保您的单例不能挂起,否则它将为所有后续消息创建一个块。

希望这可以帮助。

于 2011-08-18T12:04:08.423 回答