다음을 통해 공유


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

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

절차

InitiatorDB 데이터베이스로 전환

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

    USE InitiatorDB;
    GO
    

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

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여 넣습니다. 그런 다음 실행하여 대화를 시작하고 요청 메시지를 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 데이터베이스로 전환

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

    USE TargetDB;
    GO
    

요청 받기 및 응답 보내기

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여 넣습니다. 그런 다음 실행하여 TargetQueue2DB의 응답 메시지를 받고 시작자에게 응답 메시지를 다시 보냅니다. RECEIVE 문이 요청 메시지를 검색합니다. 그런 다음 SELECT 문이 이 메시지가 이전 단계에서 보낸 것과 같은 메시지인지 확인할 수 있도록 텍스트를 표시합니다. IF 문은 받은 메시지가 요청 메시지 유형인지 여부를 테스트하고, SEND 문을 사용하여 시작자에게 응답 메시지를 다시 보낼지 여부를 테스트합니다. 이 문은 END CONVERSATION 문이 대상 쪽의 대화를 종료하는 데 사용되는지 여부도 테스트합니다. 마지막 SELECT 문은 응답 메시지의 텍스트를 표시합니다.

    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
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

InitiatorDB 데이터베이스로 전환

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여 넣습니다. 그런 다음 실행하여 컨텍스트를 InitiatorDB 데이터베이스로 되돌립니다. 여기서 응답 메시지를 받고 대화를 종료합니다.

    USE InitiatorDB;
    GO
    

응답 받기 및 대화 종료

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여 넣습니다. 그런 다음 실행하여 응답 메시지를 받고 대화를 종료합니다. RECEIVE 문은 InitiatorQueue2DB의 응답 메시지를 받습니다. END CONVERSATION 문이 시작자 쪽의 대화를 종료합니다. 마지막 SELECT 문은 응답 메시지가 이전 단계에서 보낸 것과 같은 응답 메시지인지 확인할 수 있도록 응답 메시지의 텍스트를 표시합니다.

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

다음 단계

이것으로 자습서를 마칩니다. 자습서에는 간단한 소개만 나와 있습니다. 사용 가능한 옵션을 모두 설명하지는 않습니다. 자습서는 간소화된 논리와 오류 처리를 사용하며 프로덕션 환경에서는 사용할 수 없습니다.효율적이고 안정적이며 견고한 통신을 수행하려면 이 자습서의 예보다 더 복잡한 코드가 필요합니다.

Service Broker 자습서로 돌아가기

Service Broker 자습서