【问题标题】:How to make BizTalk only take one message at a time from the MSMQ如何使 BizTalk 一次只从 MSMQ 获取一条消息
【发布时间】:2018-01-03 12:26:50
【问题描述】:

我有一个 BizTalk 业务流程,它正在从 MSMQ 中提取消息。它处理消息并将其发送到另一个系统。

问题是,无论何时将消息放入队列,BizTalk 都会立即将其从队列中取出,即使它仍在处理前一条消息。这真的很痛苦,因为如果我重新启动编排,那么所有未处理的消息都会被删除。

有没有办法让 BizTalk 一次只接收一条消息,以便在接收下一条消息之前完全处理完该消息?

对不起,如果这是一个明显的问题,我继承了 BizTalk 系统,无法在线找到答案。

【问题讨论】:

  • 你能解释一下你的痛点吗?重新启动编排是什么意思?是否重新启动主机实例?它绝不应该导致任何消息丢失。由于其他一些潜在问题,您似乎想要引入此类处理。

标签: biztalk msmq


【解决方案1】:

虽然您可以使用 Ordered Delivery 按顺序处理消息,但无法按照您的要求序列化它们。

但是,仅仅停止编排不应删除任何内容,更不用说“所有未处理的消息”。看来是你的问题。

您应该能够停止处理而不会丢失任何东西。

如果编排进入暂停状态,那么您只需恢复一个编排和任何排队的消息都将保留并得到处理。即使应用程序是偶然“正确”创建的,这也是默认行为;)。

当您停止应用程序时,您实际上是在终止现有的业务流程以及与之相关的所有内容,包括所有排队的消息。

这是您的潜在问题,如果原始开发人员没有正确处理端口错误,编排可能会卡在无法完成的循环中。这将需要编排本身的(非常小的)mod。

【讨论】:

  • 我怀疑代码写得不好,但我们只是支持应用程序,我们不再有任何修改代码的技能。有时我们会重复失败(例如,因为下游系统没有响应),并且 Orchestration 会记录一条消息,说明它已暂停,我们需要重新启动 Orchestration。当我们这样做时,它会再次开始工作,但它已从队列中删除的所有未处理消息都会被删除。
  • 我们通过重新启动应用程序来做到这一点。我刚刚看了看,实际上似乎我们可以重新启动编排?我们应该这样做吗?
【解决方案2】:

您可以尝试使用 BizTalk MSMQ 适配器的三个属性:

批量大小

指定适配器一次从队列中取出的消息数。默认值为 20。

这可能对您有所帮助,也可能无济于事。即使设置为 1,我怀疑 BTS 会尝试同时使用剩余的“单个”消息,因为它总是会尝试并行处理,但我可能错了。

串行处理

指定消息按入队顺序出队。默认为假。

这更有可能会有所帮助,因为为了保证有序处理,您基本上仅限于单线程处理。但是,我不确定这本身是否就足够了,或者它是否只会调解消息传递到消息框数据库的顺序。您可能还需要在整个 BTS 应用程序中启用有序交付,这只能在设计时完成(即需要更改代码)。

事务性

指定消息将作为 DTC 事务的一部分发送到消息框数据库。默认为假。

这可能有助于解决消息“丢失”的其他问题。如果队列是非事务性的,并且没有被纳入到下达消息框数据库的更大事务范围中,那么如果消息出列但未处理,则会导致消息丢失。通过使整个过程原子化,任何未提交到消息框的消息都将回滚到队列中。

来源: https://msdn.microsoft.com/en-us/library/aa578644.aspx

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2011-02-13
    • 2011-04-04
    • 2023-03-31
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多