Событие Service Broker Queue BROKER_QUEUE_DISABLED запускается дважды - PullRequest
1 голос
/ 21 мая 2019

Я тестирую обработку ядовитых сообщений в процедуре активации очереди сервис-брокера.Я настроил уведомление о событии, чтобы сообщить о событии BROKER_QUEUE_DISABLED.Однако, когда очередь отключена, это событие всегда запускается дважды.Это ошибка в работе уведомления о событии или я что-то упустил?

CREATE EVENT NOTIFICATION DisabledTargetQueueNotification
ON QUEUE dbo.ProcessingQueue
FOR BROKER_QUEUE_DISABLED
TO SERVICE 'DisabledQueueNotificationService', 'current database';
GO

ALTER QUEUE DisabledQueueNotificationQueue
WITH ACTIVATION 
(
PROCEDURE_NAME = dbo.[HandleBrokerQueueDisabled],
STATUS = ON,
MAX_QUEUE_READERS = 1,
EXECUTE AS OWNER
)
GO



CREATE  OR ALTER PROCEDURE [dbo].[HandleBrokerQueueDisabled]
WITH EXECUTE AS OWNER
AS
BEGIN
DECLARE @ch UNIQUEIDENTIFIER
DECLARE @messagetypename NVARCHAR(256)
DECLARE @messagebody XML
DECLARE @queueName varchar(100)
DECLARE @message NVARCHAR(100);

WHILE (1=1)
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION

        WAITFOR (
            RECEIVE TOP(1)
                @ch = conversation_handle,
                @messagetypename = message_type_name,
                @messagebody = CAST(message_body AS XML)
            FROM DisabledQueueNotificationQueue
        ), TIMEOUT 60000

        IF (@@ROWCOUNT = 0)
        BEGIN
            ROLLBACK TRANSACTION
            BREAK
        END

        IF (@messagetypename = 'http://schemas.microsoft.com/SQL/Notifications/EventNotification')
        BEGIN
        SET @queueName = @messagebody.value('/EVENT_INSTANCE[1]/ObjectName[1]', 'VARCHAR(100)');
            SET @message = 'Disabled queue: ' + @queueName;

        -- Log queue is disabled
        -- this message is printed twice
        PRINT CAST(@messagebody AS NVARCHAR(4000));

        END

        IF (@messagetypename = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error')
        BEGIN
              END CONVERSATION @ch;
        END


        IF (@messagetypename = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
        BEGIN
            END CONVERSATION @ch;
        END
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION
        BREAK
    END CATCH
END
END
GO
...