SQL Service Broker(SSB)を習得しようとしていますが、MSDNの簡単なチュートリアルから始めます。私は "Completing a Conversation Between Databases"を見ています。要求メッセージと応答メッセージは、イニシエータとターゲットデータベースに設定され、これらのメッセージを使用する両方のdbsに関する契約、キューを使用するイニシエータdbのサービス、およびキューと契約を使用するターゲット上のサービスがあります。Service Brokerチュートリアル - 対象のデータベースに関する会話を残しました
イニシエータは、ダイアログを開始して、ターゲットサービスにメッセージを送信します。ターゲットはこのメッセージをピックアップして応答を送信し(そしてEND CONVERSATION
と呼ぶ)、最後にイニシエータは応答をピックアップし、END CONVERSATION
も呼び出します。
イニシエータでSELECT * FROM sys.conversation_endpoints
を実行すると、行は返されません。ただし、ターゲットデータベースに返される行があります。会話はCLOSED
の状態です。
これは正しいですか(つまり、ターゲットデータベースはまだこの会話を保存していますか)。そうでない場合は、どのようにして目標データベースの会話を取り除くことができますか?それが正しい場合、これらの会話はいつ消えますか?
これは要求をピックアップし、応答を送信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
ああOKターゲットdbのsecurity_timestamp列には、会話が終了してから30分後の日時があります。だからこれはいつ削除されますか? –
このタイムスタンプより前に削除されます。 –
これをクリアしていただきありがとうございます。 –