在BizTalk编排中执行线程不安全的DLL调用(或者一次只运行一个编排)



我有一个第三方DLL的问题,它不是线程安全的,但我需要在编排中调用。

我在表达式形状内进行DLL调用。同一个DLL可以在多个不同的编排中调用。

我遇到的问题是,对于一系列传入消息,BizTalk将并行运行多个编排(或一个编排的多个实例)——这会导致DLL内的异常。

是否有任何方法来解决这个问题,因为重构DLL不是一个选项。或者,是否有一种方法可以限制BizTalk在任何时候只运行一个编排。(我见过一些黑客将工作池限制为处理器的数量,但这似乎没有帮助。我们不能降级到单核机器!)

我宁愿找到一种保持DLL快乐的方法(尽管我想不出如何)而不是限制BizTalk -但是如果有一种方法可以限制这将是一个可接受的短期解决方案,同时我们与第三方讨论。(他们是一个大组织,真的应该更了解!)

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

您可以通过在业务流程中实现单例模式来限制业务流程。

您可以通过在编排中创建一个循环并拥有两个接收形状来实现这一点,一个在循环开始之前,一个在循环内部。

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

创建一个关联集,指定BTS之类的东西。MessageType并设置第一个接收形状来初始化关联,设置第二个接收形状来遵循关联。

只要循环没有结束,您就可以保证某种类型的任何消息总是由业务流程的相同实例处理。

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

希望这对你有帮助。

最新更新