Я пытаюсь изучить 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