Учебное пособие по Service Broker - оставлено с беседами в целевой базе данных - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь изучить SQL Service Broker (SSB), и я начинаю с изучения простых руководств по MSDN.Я смотрю на " Завершение диалога между базами данных ".Сообщения с запросами и ответами создаются для Инициатора и целевой базы данных, есть контракт на обе базы данных, использующие эти сообщения, Сервис на базе данных инициатора, который использует Очередь, и Сервис на цели, который использует Очередь и Контракт.

Инициатор отправляет сообщение в целевую службу, начиная диалог.Цель поднимает это сообщение и отправляет ответ (и вызывает END CONVERSATION), и, наконец, Инициатор берет ответ, а также вызывает END CONVERSATION.

Если я сейчас сделаю SELECT * FROM sys.conversation_endpoints для Инициатора,строки не возвращаются.Однако есть строка, возвращаемая в целевой базе данных;разговор находится в состоянии CLOSED.

Правильно ли это (т. е. должен ли Target db сохранять этот разговор)?Если нет, то как мне избавиться от разговора на Target db?Если это правильно, когда эти разговоры исчезают?

Это код для целевой базы данных, принимающей запрос и отправляющей ответ:

DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;

BEGIN TRANSACTION;

WAITFOR
( RECEIVE TOP(1)
    @RecvReqDlgHandle = conversation_handle,
    @RecvReqMsg = message_body,
    @RecvReqMsgName = message_type_name
  FROM TargetQueue2DB
), TIMEOUT 1000;

SELECT @RecvReqMsg AS ReceivedRequestMsg;

IF @RecvReqMsgName =
   N'//BothDB/2DBSample/RequestMessage'
BEGIN
     DECLARE @ReplyMsg NVARCHAR(100);
     SELECT @ReplyMsg =
        N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';

     SEND ON CONVERSATION @RecvReqDlgHandle
          MESSAGE TYPE
            [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg);

     END CONVERSATION @RecvReqDlgHandle;
END

COMMIT TRANSACTION;
GO

Ответы [ 2 ]

1 голос
/ 26 января 2012

Целевые конечные точки удаляются с 30-минутной задержкой, чтобы предотвратить повторные атаки.sys.conversation_endpoint.security_timestamp установлен на ЗАКРЫТЫХ конечных точках?

0 голосов
/ 06 декабря 2012

Дополнительные пояснения в дополнение к Ремусу: если разговор не может завершиться нормально, он все равно может отображаться в sys.conversation_endpoint после security_timestamp. В таком случае вы можете использовать уникальный идентификатор sys.conversation_endpoint.conversation_handle (т.е. 94798AB6-DF37-E211-BF0F-002215A14A37), чтобы вручную удалить беседу:

END CONVERSATION conversation_handle WITH CLEANUP

WITH CLEANUP важно, см. MSDN: КОНЕЦ КОНВЕРСАЦИИ (Transact-SQL)

...