代码之家  ›  专栏  ›  技术社区  ›  Chris

让ServiceBroker在检测有害消息时不那么咄咄逼人?

  •  6
  • Chris  · 技术社区  · 15 年前

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

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

    我对这个基本方法很满意,但是有没有办法把重试次数从5次改为更高的,可能是20次?

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

    ALTER QUEUE MyQueue SET RollbacksBeforePoison=20
    

    有可能吗?

    2 回复  |  直到 15 年前
        1
  •  11
  •   Remus Rusanu    15 年前

    否,毒药邮件检测回滚计数硬编码为5,您无法更改。但是,当队列被禁用时,将在队列上为 BROKER_QUEUE_DISABLED the external activation mechanis m将其线程池大小调整为传入消息的速率。

    更新

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

    POISON_MESSAGE_HANDLING(STATUS = OFF/ON)
    

    指定是否发送有害消息 已启用处理。默认值是 在…上

    包含有害消息的队列 不允许将处理设置为OFF 事务回滚。这就允许 自定义毒药信息处理系统 由应用程序定义。

        2
  •  0
  •   user368415    15 年前