다음을 통해 공유


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

이 단원에서는 내부 활성화 저장 프로시저로 구성된 시스템에서 간단한 요청-응답 메시지 주기를 완료하는 방법을 배웁니다.

절차

AdventureWorks 데이터베이스로 전환

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

    USE AdventureWorks;
    GO
    

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

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

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

요청 받기 및 응답 보내기

  • 요청 메시지를 보내면 Service Broker는 TargetActiveProc 복사본을 자동으로 활성화합니다. 이 저장 프로시저는 TargetQueueIntAct에서 응답 메시지를 받고 시작자에 응답 메시지를 돌려 보냅니다.

응답 받기 및 대화 종료

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

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

대상 쪽의 대화를 종료합니다.

  • 시작자에 대해 END CONVERSATION 문을 실행하면 Service Broker는 TargetQueueIntAct 큐에 EndDialog 메시지를 보냅니다. TargetActiveProc 프로시저는 EndDialog 메시지를 받고 대상 쪽의 대화를 종료하는 END CONVERSATION을 실행합니다.

다음 단계

//AWDB/InternalAct/InitiatorService//AWDB/InternalAct/TargetService 간의 요청-응답 메시지 주기를 성공적으로 완료했습니다. 이제 메시지의 요청-응답 쌍을 전송하려는 만큼 이 단원의 단계를 반복할 수 있습니다. SEND 및 REPLY 문을 조사한 후에는 대화에 사용된 모든 개체를 삭제할 수 있습니다. 자세한 내용은 4단원: 대화 개체 삭제를 참조하십시오.