无法启用包含5条消息的队列

时间:2014-04-10 10:57:53

标签: sql-server sql-server-2012 service-broker

我正在使用SQL Server Express 2012并且我有一个队列。

当我运行时:

SELECT TOP 1000 *, casted_message_body = 
CASE message_type_name WHEN 'X' 
  THEN CAST(message_body AS NVARCHAR(MAX)) 
  ELSE message_body 
END 
FROM [TRZIC].[dbo].[AsyncExecQueue] WITH(NOLOCK)

我得到五行。

我只做了以下脚本来清空队列。但是,当我运行它时:

declare @h uniqueidentifier
        , @messageTypeName sysname
        , @messageBody varbinary(max)
begin try
receive top(1)
    @h = [conversation_handle]
    , @messageTypeName = [message_type_name]
    , @messageBody = [message_body]
    from [AsyncExecQueue];
end try
begin catch
declare @error int
            , @message nvarchar(2048)
            , @xactState smallint;
        select @error = ERROR_NUMBER()
            , @message = ERROR_MESSAGE()
            , @xactState = XACT_STATE();

        raiserror(N'Error: %i, %s', 16, 1, @error, @message);

end catch

我收到以下消息的错误:

Error: 9617, The service queue "AsyncExecQueue" is currently disabled.

然后我在SQL Management Studio上启用队列,但是按F5刷新SQL Management Studio,然后禁用队列。

有什么问题吗?我想清空队列。

1 个答案:

答案 0 :(得分:3)

If the queue is disabling itself, it's almost always an issue with poison messages.这些是激活sproc无法处理的消息,放回队列(ROLLBACK块中有CATCH),然后不断尝试重新处理。如果这种情况发生的次数足够多(5),则会禁用队列以避免无休止的处理循环。

您应该ALTER your queue启用它并删除激活程序(...STATUS = ON, ACTIVATION (STATUS = OFF...),这样它就不会自动处理,然后您可以运行手动测试。