sql Service Broker使用以下启发式方法来确定队列中的消息何时阻止您的应用程序执行任何有用的工作:
“Service Broker提供自动中毒消息检测.当包含RECEIVE语句的事务回滚五次时,Service Broker会通过自动将队列状态设置为OFF来禁用事务从中接收消息的所有队列.” (http://msdn.microsoft.com/en-us/library/ms166137.aspx)
我对这种基本方法很好,但有没有办法将重试次数从5改为更高,可能是20?
这对我有用的原因是我当前用来处理队列的代码是一个在sql Server之外的应用程序,它有大约10个工作线程,每个工作线程都有一个独立的sqlConnection,每个线程执行自己独立的RECEIVE声明.如果此应用程序由于某种原因而死亡,则可能会为每个工作线程导致单独的回滚事务,这足以回滚以禁用队列.相反,我希望能够在不禁用队列的情况下终止我的应用程序.我应该重写应用程序以使用单个sqlConnection,但如果我可以说类似的话会更容易
ALTER QUEUE MyQueue SET RollbacksBeforePoison=20
有可能吗?
解决方法
不,病毒邮件检测回滚计数硬编码为5,您无法更改它.但是,当禁用队列时,会在
BROKER_QUEUE_DISABLED
事件的队列上引发事件通知.您可以订阅此事件并拥有一个处理程序,该处理程序可以通知管理员,甚至可以重新启用该队列.此外,该应用程序可能会利用像
the external activation mechanism这样的东西来调整其线程池大小到传入消息的速率.
更新
从sql Server 2008 R2开始,ALTER/CREATE QUEUE
:有一个新选项
POISON_MESSAGE_HANDLING(STATUS = OFF/ON)
Specifies whether poison message
handling is enabled. The default is
ON.A queue that has poison message handling set to OFF will not be disabled after five consecutive transaction rollbacks. This allows for a custom poison message handing system to be defined by the application.