如何使BizTalk一次只从MSMQ

时间:2017-07-27 16:37:02

标签: biztalk msmq

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

问题是,无论何时将消息放入队列,BizTalk都会立即将其出列,即使它仍处理上一条消息。这真是一个痛苦,因为如果我重新启动业务流程,那么所有未处理的消息都会被删除。

有没有什么方法可以让BizTalk一次只收一条消息,以便它在完成下一个消息之前完全处理完消息?

很抱歉,如果这是一个显而易见的问题,我继承了BizTalk系统,无法在线找到答案。

2 个答案:

答案 0 :(得分:1)

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

batchSize

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

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

<强> serialProcessing

指定消息按入队顺序出列。默认值为false。

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

<强>事务

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

这可能有助于解决邮件“迷路”的其他问题。如果队列是非事务性的,而且没有登记到一个更大的事务范围,该事务范围可以到达消息框DB,如果消息出列但没有处理,则会导致消息丢失。通过使整个进程成为原子,任何未提交到消息框的消息都将回滚到队列中。

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

答案 1 :(得分:0)

虽然您可以使用订购交付按顺序处理邮件,但无法按照您要求的方式进行序列化。

但是,仅停止Orchestration不应删除任何内容,更不要说“所有未处理的消息”。似乎那是你的问题。

你应该能够在不丢失任何东西的情况下停止处理。

如果业务流程进入已暂停状态,那么您需要做的只是恢复,一个业务流程和排队的所有消息将保留并进行处理。即使应用程序是偶然“正确”创建的,这也是默认行为。)。

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

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