我有一个BizTalk业务流程正在从MSMQ中获取消息。它处理消息并将其发送到另一个系统。
问题是,无论何时将消息放入队列,BizTalk都会立即将其出列,即使它仍处理上一条消息。这真是一个痛苦,因为如果我重新启动业务流程,那么所有未处理的消息都会被删除。
有没有什么方法可以让BizTalk一次只收一条消息,以便它在完成下一个消息之前完全处理完消息?
很抱歉,如果这是一个显而易见的问题,我继承了BizTalk系统,无法在线找到答案。
答案 0 :(得分:1)
您可以尝试使用BizTalk MSMQ适配器的三个属性:
batchSize
指定适配器一次从队列中删除的消息数。默认值为20.
这可能会也可能不会对您有所帮助。即使设置为1,我怀疑BTS会尝试同时使用剩余的“单个”消息,因为它总是尝试并行处理,但我可能错了。
<强> serialProcessing 强>
指定消息按入队顺序出列。默认值为false。
这更有可能有所帮助,因为为了保证有序处理,您基本上只限于单线程处理。但是,我不确定这本身是否足够,或者它是否只会调解消息传递到消息框数据库的顺序。您可能还需要在整个BTS应用程序中启用有序传递,这只能在设计时完成(即需要更改代码)。
<强>事务强>
指定将消息作为DTC事务的一部分发送到消息框数据库。默认值为false。
这可能有助于解决邮件“迷路”的其他问题。如果队列是非事务性的,而且没有登记到一个更大的事务范围,该事务范围可以到达消息框DB,如果消息出列但没有处理,则会导致消息丢失。通过使整个进程成为原子,任何未提交到消息框的消息都将回滚到队列中。
答案 1 :(得分:0)
虽然您可以使用订购交付按顺序处理邮件,但无法按照您要求的方式进行序列化。
但是,仅停止Orchestration不应删除任何内容,更不要说“所有未处理的消息”。似乎那是你的问题。
你应该能够在不丢失任何东西的情况下停止处理。
如果业务流程进入已暂停状态,那么您需要做的只是恢复,一个业务流程和排队的所有消息将保留并进行处理。即使应用程序是偶然“正确”创建的,这也是默认行为。)。
当您停止应用程序时,您实际上是终止现有的业务流程及其相关的所有内容,包括任何排队的消息。
这是您的潜在问题,如果原始开发人员没有正确处理Port错误,Orchestration可能会卡在一个不可完成的循环中。这需要一个(非常小的)mod来编排Orchestration本身。