Share via


4단원: 대화 시작 및 메시지 전송

새 설치: 2007년 9월 15일

이 단원에서는 같은 데이터베이스 엔진 인스턴스에 있는 두 데이터베이스 간의 대화를 시작하는 방법을 배웁니다. 또한 간단한 요청-응답 메시지 주기를 완료하고 대화를 종료하는 방법도 익힙니다.

절차

InitiatorDB 데이터베이스로 전환

  1. 쿼리 편집기 창에 다음 코드를 복사하여 붙여 넣습니다. 그런 다음 이를 실행하여 대화를 시작할 InitiatorDB 데이터베이스로 컨텍스트를 전환합니다.

    USE InitiatorDB;
    GO
    

대화 시작 및 요청 메시지 전송

  1. 쿼리 편집기 창에 다음 코드를 복사하여 붙여 넣습니다. 그런 다음 이를 실행하여 대화를 시작하고 TargetDB//TgtDB/2DBSample/TargetService로 요청 메시지를 전송합니다. BEGIN DIALOG에서 SEND 문으로 대화 핸들을 전송하는 데 변수가 사용되므로 코드는 한 블록에서 실행되어야 합니다. 일괄 처리는 BEGIN DIALOG 문을 실행하여 대화를 시작하고 요청 메시지를 작성합니다. 그런 다음 SEND 문의 대화 핸들을 사용하여 해당 대화에 요청 메시지를 전송합니다. 마지막 SELECT 문은 전송된 메시지의 텍스트를 표시합니다.

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE [//InitDB/2DBSample/InitiatorService]
         TO SERVICE N'//TgtDB/2DBSample/TargetService'
         ON CONTRACT [//BothDB/2DBSample/SimpleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE [//BothDB/2DBSample/RequestMessage]
          (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

TargetDB 데이터베이스로 전환

  1. 쿼리 편집기 창에 다음 코드를 복사하여 붙여 넣습니다. 그런 다음 이를 실행하여 TargetDB 데이터베이스로 컨텍스트를 전환합니다. 여기에서 요청 메시지를 수신하고 InitiatorDB로 응답 메시지를 전송하게 됩니다.

    USE TargetDB;
    GO
    

요청 수신 및 응답 전송

  1. 쿼리 편집기 창에 다음 코드를 복사하여 붙여 넣습니다. 그런 다음 이를 실행하여 TargetQueue2DB에서 응답 메시지를 받고 시작자로 응답 메시지를 전송합니다. RECEIVE 문은 요청 메시지를 검색합니다. 그러면 SELECT 문이 텍스트를 표시하며 이를 통해 이전 단계에서 전송한 메시지와 동일한 메시지인지 확인할 수 있습니다. IF 문은 수신한 메시지가 요청 메시지 유형인지, 그리고 응답 메시지를 시작자에 전송하는 데 SEND 문이 사용되었는지 테스트합니다. 또한 대화의 대상 측을 종료하는 데 END CONVERSATION 문이 사용되었는지도 테스트합니다. 마지막 SELECT 문은 응답 메시지의 텍스트를 표시합니다.

    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg NVARCHAR(100);
    DECLARE @RecvReqMsgName sysname;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
    FROM TargetQueue2DB;
    
    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
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

InitiatorDB 데이터베이스로 전환

  1. 쿼리 편집기 창에 다음 코드를 복사하여 붙여 넣습니다. 그런 다음 이를 실행하여 InitiatorDB 데이터베이스로 컨텍스트를 다시 전환합니다. 여기에서 응답 메시지를 수신하고 대화를 종료하게 됩니다.

    USE InitiatorDB;
    GO
    

응답 수신 및 대화 종료

  1. 쿼리 편집기 창에 다음 코드를 복사하여 붙여 넣습니다. 그런 다음 이를 실행하여 응답 메시지를 수신하고 대화를 종료합니다. RECEIVE 문은 InitiatorQueue2DB에서 응답 메시지를 검색합니다. END CONVERSATION 문은 대화의 시작자 측을 종료합니다. 마지막 SELECT 문은 응답 메시지의 텍스트를 표시하며 이를 통해 이전 단계에서 전송한 메시지와 동일한 메시지인지 확인할 수 있습니다.

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueue2DB;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

다음 단계

이것으로 자습서가 완료되었습니다. 자습서는 간단한 개요이며 사용 가능한 모든 옵션을 설명하지는 않습니다. 또한 중요한 작업에 초점을 맞추기 위해 논리와 오류 처리가 단순화되어 있습니다. 효율적이고 안정적이고 견고한 대화를 만들기 위해서는 이 자습서의 예보다 더 복잡한 코드가 필요합니다.

Service Broker 자습서로 돌아가기

Service Broker 자습서

참고 항목

관련 자료

BEGIN DIALOG CONVERSATION(Transact-SQL)
END CONVERSATION(Transact-SQL)
RECEIVE(Transact-SQL)
SEND(Transact-SQL)
WAITFOR(Transact-SQL)
Service Broker Programming Basics

도움말 및 정보

SQL Server 2005 지원 받기