【问题标题】:Making a thread-unsafe DLL call in BizTalk Orchestration (or only running one Orchestration at a time)在 BizTalk 编排中进行线程不安全的 DLL 调用(或一次只运行一个编排)
【发布时间】:2011-10-29 17:31:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 也许自己包装 dll 并做一些锁定,然后从编排中调用包装器。

标签: dll biztalk parallel-processing orchestration


【解决方案1】:

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

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

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

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 我认为这是唯一不错的方式。这不是很好,但也许我可以通过使用异常处理程序和补偿形状以保持编排运行来减轻暂停。谢谢 - 我认为这就是答案。 (相应标记)
猜你喜欢
  • 2013-01-12
  • 2021-11-30
  • 2012-01-01
  • 2012-10-19
  • 2012-03-19
  • 1970-01-01
  • 2019-11-24
  • 2019-10-30
  • 1970-01-01
相关资源
最近更新 更多