2011-08-18 48 views
0

我有一个第三方DLL的问题,它不是线程安全的,但我需要在编排中调用。在BizTalk Orchestration中进行线程不安全的DLL调用(或一次只运行一个Orchestration)

我正在做一个表达式形状中的DLL调用。在许多不同的业务流程中调用相同的DLL。

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

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

我宁愿找到一种方法保持DLL快乐(虽然我想不出如何)比油门BizTalk - 但如果有一种方法来扼杀这将是一个可接受的短期解决方案,而我们与第三方讨论。 (谁是一个大型组织,真的应该知道得更多!)

+0

也许自己包裹的dll和做一些锁,然后调用从编排的包装。 –

回答

1

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

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

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

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

您可以创建一个相关集,它指定类似BTS.MessageType的内容,并设置第一个接收形状以启动关联,第二个接收形状将遵循关联。

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

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

希望这会有所帮助。

+0

我认为这是唯一体面的方式。这不是很好,但也许我可以通过使用异常处理程序和补偿形状来缓解暂停,以保持协调运行。谢谢 - 我认为这是答案。 (相应标记) –