다음을 통해 공유


2단원: 내부 활성화 프로시저 만들기

이 단원에서는 Service Broker 큐에서 메시지를 처리하기 위한 저장 프로시저를 만드는 방법을 배웁니다. 또한 큐에 메시지가 있을 때 프로시저를 활성화하도록 지정하는 방법도 배웁니다.

절차

AdventureWorks 데이터베이스로 전환

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

    USE AdventureWorks;
    GO
    

내부 활성화 저장 프로시저 만들기

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여 넣습니다. 그런 다음 코드를 실행하여 저장 프로시저를 만듭니다. 실행하면 저장 프로시저는 큐에 메시지가 있는 한 계속해서 메시지를 받습니다. 메시지 반환 없이 수신 시간이 초과되면 저장 프로시저가 종료됩니다. 받은 메시지가 요청 메시지인 경우 저장 프로시저는 응답 메시지를 반환합니다. 받은 메시지가 EndDialog 메시지인 경우 저장 프로시저는 대상 쪽의 대화를 종료합니다. 받은 메시지가 Error 메시지인 경우 트랜잭션이 롤백됩니다.

    CREATE PROCEDURE TargetActivProc
    AS
      DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
      DECLARE @RecvReqMsg NVARCHAR(100);
      DECLARE @RecvReqMsgName sysname;
    
      WHILE (1=1)
      BEGIN
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReqDlgHandle = conversation_handle,
            @RecvReqMsg = message_body,
            @RecvReqMsgName = message_type_name
          FROM TargetQueueIntAct
        ), TIMEOUT 5000;
    
        IF (@@ROWCOUNT = 0)
        BEGIN
          ROLLBACK TRANSACTION;
          BREAK;
        END
    
        IF @RecvReqMsgName =
           N'//AWDB/InternalAct/RequestMessage'
        BEGIN
           DECLARE @ReplyMsg NVARCHAR(100);
           SELECT @ReplyMsg =
           N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
           SEND ON CONVERSATION @RecvReqDlgHandle
                  MESSAGE TYPE 
                  [//AWDB/InternalAct/ReplyMessage]
                  (@ReplyMsg);
        END
        ELSE IF @RecvReqMsgName =
            N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
        BEGIN
           END CONVERSATION @RecvReqDlgHandle;
        END
        ELSE IF @RecvReqMsgName =
            N'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
        BEGIN
           END CONVERSATION @RecvReqDlgHandle;
        END
    
        COMMIT TRANSACTION;
    
      END
    GO
    

대상 큐를 변경하여 내부 활성화 지정

  • 다음 코드를 복사하여 쿼리 편집기 창에 붙여 넣습니다. 그런 다음 코드를 실행하여 Service Broker가 TargetActiveProc 저장 프로시저를 활성화하여 TargetQueueIntAct의 메시지를 처리하도록 지정합니다. Service Broker는 TargetQueueIntAct에 메시지가 수신되고 이미 실행 중인 TargetActiveProc 프로시저 복사본이 없는 경우 이 프로시저의 복사본을 실행합니다. 기존 복사본이 수신되는 메시지의 수를 감당하지 못하게 되면 Service Broker는 TargetActiveProc의 복사본을 추가로 실행합니다.

    ALTER QUEUE TargetQueueIntAct
        WITH ACTIVATION
        ( STATUS = ON,
          PROCEDURE_NAME = TargetActivProc,
          MAX_QUEUE_READERS = 10,
          EXECUTE AS SELF
        );
    GO
    

다음 단계

//AWDB/InternalAct/InitiatorService//AWDB/InternalAct/TargetService 간의 대화를 지원하도록 AdventureWorks를 성공적으로 구성했습니다. 이제 이 구성을 사용하는 대화를 완료합니다. 3단원: 대화 시작 및 메시지 전송을 참조하십시오.