让服务经纪人对检测毒药信息不那么积极?

Chr*_*ris 6 sql-server service-broker

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
Run Code Online (Sandbox Code Playgroud)

有可能吗?

Rem*_*anu 11

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

更新

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

POISON_MESSAGE_HANDLING(STATUS = OFF/ON)
Run Code Online (Sandbox Code Playgroud)

指定是否启用了病毒邮件处理.默认为ON.

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