6

Sql Service Broker 使用以下启发式方法来确定您的队列中何时有消息阻止您的应用程序执行任何有用的工作:

“Service Broker 提供自动有害消息检测。当包含 RECEIVE 语句的事务回滚五次时,Service Broker 会通过自动将队列状态设置为 OFF 来禁用事务接收消息的所有队列。” ( http://msdn.microsoft.com/en-us/library/ms166137.aspx )

我对这种基本方法很好,但是有没有办法将重试次数从五次更改为更高的值,也许是二十次?

这对我有用的原因是我当前用来处理队列的代码是 Sql Server 之外的一个应用程序,它有大约 10 个工作线程,每个工作线程都有一个独立的 SqlConnection,每个都执行自己独立的接收语句。如果此应用程序因某种原因而死,这可能会导致每个工作线程的单独回滚事务,这足以禁用队列。相反,我希望能够在不禁用队列的情况下终止我的应用程序。我可能应该重写应用程序以使用单个 SqlConnection,但如果我能说类似的话会容易得多

ALTER QUEUE MyQueue SET RollbacksBeforePoison=20

这样的事情可能吗?

4

2 回答 2

11

不,有害消息检测回滚计数被硬编码为 5,您无法更改它。但是,当队列被禁用时,会在队列上针对该 BROKER_QUEUE_DISABLED事件引发事件通知。您可以订阅此事件并拥有一个通知管理员,甚至重新启用队列的处理程序。此外,应用程序可能会利用诸如外部激活机制m 之类的东西来调整其线程池大小以适应传入消息的速率。

更新

从 SQL Server 2008 R2 开始,有一个新选项ALTER/CREATE QUEUE

POISON_MESSAGE_HANDLING(STATUS = OFF/ON)

指定是否启用有害消息处理。默认值为开。

在连续五次事务回滚后,将不会禁用有毒消息处理设置为 OFF 的队列。这允许应用程序定义自定义的毒消息处理系统。

于 2009-09-02T02:09:05.413 回答
0

毒药检测算法(俄语)http://www.queue.net.ru/2010/06/poison-message-detection-algorithm.html

于 2010-06-16T15:40:34.907 回答