다음을 통해 공유


Service Broker 오류 메시지 처리

Service Broker 응용 프로그램에서는 대화에서 받은 두 가지 유형의 오류 메시지를 처리해야 합니다. 한 가지는 Service Broker를 사용하는 응용 프로그램에서 만든 오류 메시지이고 다른 한 가지는 Service Broker에서 만든 시스템 메시지입니다.

응용 프로그램 오류 조건 보고

Service Broker 응용 프로그램은 일반적으로 서로 다른 컴퓨터에서 비동기적으로 실행되는 코드로 구성된 시스템입니다. 응용 프로그램의 각 부분은 Service Broker 대화에서 보내는 메시지를 사용하여 서로 통신합니다. Service Broker 대화의 한 쪽에 있는 응용 프로그램 부분에서는 오류 메시지를 보내는 방법으로 다른 쪽에 응용 프로그램 오류를 보고할 수 있습니다. 메시지를 받는 쪽에는 오류 메시지를 감지하고 오류 조건을 올바르게 처리할 코드가 있어야 합니다.

Service Broker 응용 프로그램에서는 시스템 정의 또는 응용 프로그램 정의 메시지 유형을 사용하여 오류를 전달할 수 있습니다.

시스템 정의 오류 메시지

대화를 종료해야 할 만큼 심각한 응용 프로그램 오류를 보고하려면 END CONVERSATION 문의 WITH ERROR 절을 사용합니다. 예를 들면 다음과 같습니다.

END CONVERSATION @ConversationHandle
    WITH ERROR = 1234 DESCRIPTION = "The account specified in the invoice does not exist, verify the account number."

END CONVERSATION WITH ERROR 문은 다음을 수행합니다.

  • Service Broker 시스템 오류 메시지를 생성하여 대화의 원격측에 보냅니다. 오류 메시지에는 시스템 정의 https://schemas.microsoft.com/SQL/ServiceBroker/Error 메시지 유형이 사용됩니다.

  • 대화의 로컬측을 종료합니다.

Error 메시지를 받는 응용 프로그램 부분에서는 필요한 정리 작업을 수행하고 해당 대화를 종료해야 합니다.

응용 프로그램에서는 언제든지 오류가 발생한 활성 대화를 종료할 수 있습니다. 그러나 대화의 원격측에서 대화를 이미 종료한 경우 Service Broker에서는 원격측에 오류 메시지를 보내지 않습니다. 대신 Service Broker에서는 대화의 로컬측을 종료하고 로컬 큐에서 해당 대화의 모든 메시지를 제거합니다.

응용 프로그램 정의 오류 메시지

대화를 종료해야 할 만큼 심각하지 않은 오류를 보고하려면 응용 프로그램 정의 오류 메시지를 사용합니다. 응용 프로그램 디자이너는 다음 항목을 지정할 수 있습니다.

  • 응용 프로그램 오류를 전달하는 데 사용되는 하나 이상의 메시지 유형

  • 메시지 유형을 처리하기 위한 논리

오류 조건이 발생한 응용 프로그램 부분에서는 다음을 수행할 수 있습니다.

  • 대화의 로컬측에 대해 필요한 정리 작업을 수행합니다.

  • 응용 프로그램 정의 메시지 유형을 사용하여 메시지를 작성하고 이를 대화를 통해 보냅니다.

오류 메시지를 받는 원격 응용 프로그램 부분에는 오류 메시지를 인식하고 연결의 해당 부분에 대해 필요한 정리 작업을 수행하는 코드가 있어야 합니다.

오류 메시지 처리

Service Broker 대화에서 메시지를 받는 응용 프로그램 코드에는 대화에서 받은 오류 메시지를 처리하기 위한 논리가 있어야 합니다. 이 코드에서는 다음과 같은 오류 메시지를 감지하고 처리해야 합니다.

  • 응용 프로그램 정의 오류 메시지 유형을 사용하는 응용 프로그램에서 생성된 오류 메시지

  • END CONVERSATION 문의 WITH ERROR 절을 사용하는 응용 프로그램에서 생성된 오류 메시지. 이러한 오류 메시지에는 https://schemas.microsoft.com/SQL/ServiceBroker/Error 메시지 유형이 사용되고 Code 요소에는 양수 값이 사용됩니다.

  • Service Broker에서 생성된 오류 메시지. 이러한 오류 메시지에는 https://schemas.microsoft.com/SQL/ServiceBroker/Error 메시지 유형이 사용되고 Code 요소에는 음수 값이 사용됩니다. Service Broker에서는 오류로 인해 Service Broker에서 대화를 계속할 수 없을 때 Error 메시지를 만듭니다. 예를 들어 대상 서비스가 현재 인스턴스에 없고 라우팅 테이블에 해당 서비스에 대한 항목이 없으면 Service Broker에서는 해당 서비스를 찾을 수 없습니다. 이 경우 Service Broker에서는 대화에 대한 Error 메시지를 만듭니다.

RECEIVE 문에서 반환되는 결과 집합에는 message_type_name 열이 들어 있습니다. Service Broker 메시지를 받는 코드에서는 일반적으로 message_type_name을 사용하여 연결된 메시지 유형을 처리하는 코드에 각 메시지를 라우팅합니다.

프로그램의 정확한 오류 처리 논리는 응용 프로그램에 따라 다릅니다. 예를 들어 메시지 보존 기능을 사용하며 태스크가 실패할 때 보정 트랜잭션을 수행해야 하는 프로그램에서는 오류를 받으면 큐에서 이미 처리된 메시지를 쿼리하고 보정 트랜잭션을 수행한 다음 대화를 종료합니다. 반면 오류가 발생했음을 기록하기만 하면 되는 프로그램에서는 로깅 테이블에 오류를 로깅하고 대화를 종료합니다.

https://schemas.microsoft.com/SQL/ServiceBroker/Error 메시지의 Code 요소에는 오류 코드가 들어 있습니다. END CONVERSATION WITH ERROR를 사용하는 응용 프로그램에서 만든 Error 메시지의 오류 코드에는 양수 값이 사용됩니다. Service Broker에서 생성된 Error 메시지의 오류 코드에는 음수 값이 사용됩니다. Service Broker에서 생성된 메시지의 Code 값은 단지 Error 메시지를 발생시킨 오류의 오류 코드에 대한 음수 값입니다. 예를 들어 오류 코드가 9615인 XML 유효성 검사 오류가 발생하면 데이터베이스 엔진에서는 -9615 값이 포함된 Code 요소가 있는 Error 메시지를 만듭니다.

응용 프로그램에서 Error 메시지를 받으면 이 프로그램에서는 해당 대화에 더 이상 메시지를 보내지 않습니다. 응용 프로그램에서는 오류를 처리한 다음 해당 대화를 종료합니다. 응용 프로그램에서 응용 프로그램 정의 오류 메시지 유형을 받은 경우 응용 프로그램의 원격 부분에서도 END CONVERSATION을 실행하지 않았으면 여전히 대화를 사용할 수 있습니다.

오류 처리 루틴은 포이즌 메시지를 방지하기 위한 방식과 같은 방식으로 코딩되어야 합니다. 자세한 내용은 포이즌 메시지 처리를 참조하십시오.