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
有可能吗?
答案 0 :(得分:11)
不,病毒邮件检测回滚计数硬编码为5,您无法更改它。但是,当禁用队列时,会在BROKER_QUEUE_DISABLED
事件的队列上引发事件通知。您可以订阅此事件并拥有一个处理程序,该处理程序可以通知管理员,甚至可以重新启用该队列。此外,应用程序可能会利用the external activation mechanis m之类的东西来调整其线程池大小,以调整传入消息的速率。
<强>更新强>
从SQL Server 2008 R2开始,ALTER/CREATE QUEUE
:
POISON_MESSAGE_HANDLING(STATUS = OFF/ON)
指定是否有毒邮件 处理已启用。默认是 ON。
有毒邮件的队列 处理设置为OFF不会 连续五次禁用 事务回滚。这允许 自定义毒药信息处理系统 由申请书定义。
答案 1 :(得分:0)