SQL Server 2016的服务代理。“ is_activation_enabled”一直关闭

时间:2018-09-11 22:27:49

标签: sql-server service-broker

服务经纪人似乎正在为我们工作,正在处理大多数消息,只是 is_activation_enabled 从0切换到1,然后全天自行返回。我们找不到对此的解释。为什么这样做呢?这是否意味着出了什么问题? is_activation_enabled 需要保持为(= 1),因为我们有一个activation_procedure。我们通过运行以下查询来观察该标志:

SELECT * FROM sys.service_queues

有人可以解释是什么原因造成的吗?

注意:我知道有毒消息会禁用队列。请不要将我的问题与is_receive_enabled或其他标志之一混淆。我要询问的唯一标志是 is_activaton_enabled

我可以通过运行查询select * from sys.dm_broker_queue_monitors来查看队列何时在积极地处理消息,但是积极地处理消息和启用消息的处理的概念是不同的。

希望服务经纪人专家在那里!

我们的Microsoft SQL Server 2016(SP1)版本(KB3182545)-13.0.4001.0(X64)2016年10月28日18:17:30版权所有(c)Microsoft Corporation企业版:基于核心的许可(64位)于Windows Server 2012 R2 Standard 6.3(内部版本9600:)(系统管理程序)

2 个答案:

答案 0 :(得分:0)

我首先想到的是一个扩展的事件会话,但是我没有看到合适的事件。但是,我认为您正在寻找DDL触发器。请考虑以下内容:

create trigger tr_catch_queue_alter
on DATABASE
for alter_queue
AS
BEGIN
    select EVENTDATA();
END

触发器的主体不是您想要的;您将需要切碎其输出的XML并将其存储在表的某个地方。刚在本地实例上运行它时,我得到了:

<EVENT_INSTANCE>
  <EventType>ALTER_QUEUE</EventType>
  <PostTime>2018-09-12T20:17:22.497</PostTime>
  <SPID>54</SPID>
  <ServerName>«redacted»</ServerName>
  <LoginName>«redacted»</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>«redacted»</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>«redacted»</ObjectName>
  <ObjectType>QUEUE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>alter queue «redacted» with activation (status = on, execute as owner, procedure_name = dbo.«redacted»)
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

(显然«redacted»只是对我的特定环境敏感的数据;在运行时,您会获得实际的详细信息)。

注意:这只是第一步。但是从上面,您可以看到有关alter queue语句的以下信息:

  • 何时
  • 来自哪个主机
  • 由谁
  • 实际陈述

所以,尽管这是第一步,但我认为它有可能成为相当大的一个。

答案 1 :(得分:0)

事实证明,该进程正在停止,因为它遇到了有害消息。我们通过在负责将消息添加到服务代理队列之前构建消息的存储过程中添加更多验证来解决此问题。