我遇到第三方DLL的问题,这不是线程安全的,但我需要在业务流程中调用。
我正在表达式形状中进行DLL调用。在许多不同的编排中调用相同的DLL。
我遇到的问题是,对于一系列传入消息,BizTalk将并行运行多个业务流程(或业务流程的多个实例) - 这会导致DLL内的异常。
有没有办法解决这个问题,因为重构DLL不是一个选项。或者,有没有办法限制BizTalk在任何时候只运行一个业务流程。 (我已经看到一些黑客将工作池限制为处理器数量,但这似乎没有帮助。我们无法降级到单核机器!)
我宁愿找到一种方法来保持DLL的快乐(虽然我怎么想不起)而不是限制BizTalk - 但是如果有一种方法来限制这将是一个可接受的短期解决方案,而我们与第三个讨论派对。 (谁是一个大型组织,真的应该知道更好!)
答案 0 :(得分:1)
即使在单核心机器上,BizTalk也会运行并发编排。
您可以通过在业务流程中实现单例模式来限制业务流程。
您可以通过在业务流程中创建一个循环并具有两个接收形状来实现此目的,一个在循环开始之前,一个在循环内。
这两个接收都绑定到相同的入站逻辑端口。
您创建一个相关集,它指定类似BTS.MessageType的东西,并设置第一个接收形状以启动相关,第二个接收则遵循相关性。
只要循环没有结束,您就可以保证某个类型的任何消息始终由业务流程的同一个实例处理。
然而,使用单身是一个设计决定,有缺点。例如,吞吐量会受到影响,您必须确保您的单例不能挂起,否则它将为所有后续消息创建一个块。
希望这会有所帮助。