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

적용 대상:SQL ServerAzure SQL Managed Instance

이 단원에서는 대화를 시작하고, 간단한 요청-회신 메시지 주기를 완료한 다음 대화를 끝내는 방법을 배웁니다.

절차

참고 항목

예제는 SQL Server 2008 R2(10.50.x)에서 유효성을 검사했습니다. AdventureWorks 샘플 데이터베이스AdventureWorks2008R2 샘플 데이터베이스를 사용하여 예제를 완료하는 것이 좋습니다.

SQL Server Service Broker는 현재 버전의 SQL Server에서 지원됩니다.

AdventureWorks2008R2 데이터베이스로 전환

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

        USE AdventureWorks2008R2;
        GO
    

대화를 시작하고 요청 메시지 보내기

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

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

요청을 받고 회신을 보냅니다.

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여넣습니다. 그런 다음, 이를 실행하여 TargetQueue1DB의 응답 메시지를 받고 시작자에게 응답 메시지를 다시 보냅니다. 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 TargetQueue1DB
        ), TIMEOUT 1000;
    
        SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
        IF @RecvReqMsgName =
           N'//AWDB/1DBSample/RequestMessage'
        BEGIN
             DECLARE @ReplyMsg NVARCHAR(100);
             SELECT @ReplyMsg =
             N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
             SEND ON CONVERSATION @RecvReqDlgHandle
                  MESSAGE TYPE
                  [//AWDB/1DBSample/ReplyMessage]
                  (@ReplyMsg);
    
             END CONVERSATION @RecvReqDlgHandle;
        END
    
        SELECT @ReplyMsg AS SentReplyMsg;
    
        COMMIT TRANSACTION;
        GO
    

회신 메시지 수신 및 대화 종료

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

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

다음 단계

//AWDB/1DBSample/InitiatorService//AWDB/1DBSample/TargetService 간의 요청-응답 메시지 주기를 성공적으로 완료했습니다. 요청-회신 메시지 쌍을 전송하려는 경우 이 단원의 단계를 여러 번 반복할 수 있습니다. SEND 및 REPLY 문 조사를 마치면 대화에서 사용된 모든 개체를 삭제할 수 있습니다. 자세한 내용은 3단원: 대화 개체 삭제를 참조하세요.

참고 항목