如何使BizTalk一次仅从MSMQ接收一条消息

如何使BizTalk一次仅从MSMQ接收一条消息,biztalk,msmq,Biztalk,Msmq,我有一个BizTalk业务流程正在从MSMQ接收消息。它处理消息并将其发送到另一个系统 问题是,无论何时将消息放入队列,BizTalk都会立即将其出列,即使它仍在处理前一条消息。这是一个真正的痛苦,因为如果我重新启动编排,那么所有未处理的消息都会被删除 有没有办法让BizTalk一次只接收一条消息,以便在接收下一条消息之前完全完成对该消息的处理 很抱歉,如果这是一个明显的问题,我继承了BizTalk系统,无法联机找到答案。虽然您可以使用有序传递按顺序处理消息,但无法按您要求的方式序列化消息 然而

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

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

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


很抱歉,如果这是一个明显的问题,我继承了BizTalk系统,无法联机找到答案。

虽然您可以使用有序传递按顺序处理消息,但无法按您要求的方式序列化消息

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

您应该能够在不丢失任何内容的情况下停止处理

如果业务流程将进入挂起状态,那么您需要做的就是恢复,一个业务流程和任何排队的消息将保留并被处理。这将是默认行为,即使应用程序是意外“正确”创建的;)

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


这是您潜在的问题,如果原始开发人员没有正确处理端口错误,编排可能会陷入无法完成的循环中。这需要对业务流程本身进行(非常小的)修改。

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

批量大小

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

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

串行处理

指定按消息排队顺序将消息排队。默认值为false

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

事务性的

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

这可能有助于解决邮件“丢失”的其他问题。如果队列是非事务性的,而且没有登记在更大的事务范围内(一直延伸到MessageBox DB),那么如果消息已退出队列但未进行处理,则会导致消息丢失。通过使整个过程原子化,任何未提交到消息框的消息都将回滚到队列中

资料来源:

你能再解释一下你的痛点吗?您所说的重新启动编排是什么意思?是重启主机实例吗?它不应该导致任何消息丢失。由于其他一些潜在问题,您似乎希望引入这种处理。我怀疑代码编写得很糟糕,但我们只是支持应用程序,我们不再有任何修改代码的技能。有时我们会遇到重复的故障(例如,因为下游系统没有响应),业务流程会记录一条消息,说它已挂起,我们需要重新启动业务流程。当我们这样做时,它会重新开始工作,但是它从队列中删除的所有未处理的消息都会被删除。我刚才看了一下,实际上我们似乎可以重新开始编排?我们应该这样做吗?