다음을 통해 공유


영구 Client-Side 오류

경우에 따라 메시지 큐는 메시지를 대상 큐로 이동할 수 있습니다. 예를 들어 큐 액세스 제어에서 메시지를 클라이언트에서 서버로 이동하는 것을 허용하지 않으면 잘못된 메시지가 클라이언트 쪽 배달 못한 편지 큐로 이동됩니다. 이 경우 COM+ 큐에 대기 중인 구성 요소 서비스를 사용하면 예외 클래스를 구성 요소와 연결할 수 있습니다. 예외 클래스를 구성 요소와 연결하려면 Component Services 관리 도구의 구성 요소 속성 페이지에서 고급 탭을 사용합니다. COM+ 관리 함수의 ExceptionClass 카탈로그 구성 요소 특성을 사용하여 프로그래밍 방식으로 예외 클래스를 연결할 수도 있습니다.

예외 클래스는 IPlaybackControl을 구현하는 구성 요소의 ProgID 또는 CLSID로 정의됩니다. 큐에 대기 중인 구성 요소 서비스에는 Xact 배달 못한 편지 큐를 검사하는 배달 못한 편지 큐 모니터가 있습니다. 큐에 메시지가 있는 경우 배달 못한 편지 큐 모니터는 대상 구성 요소와 연결된 예외 처리기를 인스턴스화하고 IPlaybackControl::FinalClientRetry를 호출하여 클라이언트 쪽에서 복구할 수 없는 오류가 있음을 나타냅니다.

IPlaybackControl 외에도 예외 처리기는 예외를 처리하는 서버 구성 요소와 동일한 인터페이스 집합을 구현해야 합니다. IPlaybackControl::FinalClientRetry가 호출되면 대기 중인 구성 요소 런타임이 실패한 메시지를 예외 처리기로 재생합니다. 이렇게 하면 예외 처리기가 서버로 이동할 수 없는 메시지에 대한 대체 동작(예: 보상 트랜잭션 생성)을 구현할 수 있습니다.

예외 처리기가 재생된 모든 메서드 호출을 완료하면 메시지가 Xact 배달 못 한 편지 큐에서 제거되고 해제됩니다. 그러나 예외 처리기가 메서드 호출 중 하나에서 오류 상태 반환하여 메시지를 중단하는 경우 메시지는 Xact 배달 못한 편지 큐로 반환됩니다. 다음 이벤트 시퀀스는 클라이언트 쪽 예외가 처리되는 방법을 보여 줍니다.

  1. 메시지 큐가 서버에 메시지를 배달하지 못하고 메시지를 Xact 배달 못 한 편지 큐에 넣습니다.
  2. DLQL(배달 못한 편지 큐 수신기)은 Xact 배달 못한 편지 큐에서 메시지를 찾습니다.
  3. DLQL은 메시지에서 대상 구성 요소 CLSID를 검색하고 예외 클래스를 확인합니다.
  4. DLQL은 예외 클래스를 인스턴스화합니다.
  5. DLQL은 예외 클래스에 대해 IPlaybackControl 을 쿼리합니다.
  6. DLQL은 예외 클래스에서 IPlaybackControl::FinalClientRetry 메서드를 호출합니다.
  7. DLQL은 메시지에서 예외 클래스로의 모든 속성 및 메서드 호출을 재생합니다.
  8. 예외 처리기가 트랜잭션을 성공적으로 완료하면 DLQL에서 메시지를 삭제합니다. 예외 처리기는 IObjectContext::SetAbort를 실행할 수 있으며 메시지는 배달 못한 편지 큐에 유지됩니다.

이전 단계가 실패하면 메시지는 Xact 배달 못 한 편지 큐에 남아 있습니다.

시작하면 DLQL은 메시지 큐 트랜잭션 배달 못한 편지 큐에서 각 메시지를 읽고 큐에 대기 중인 각 구성 요소 메시지에 대한 예외 클래스를 인스턴스화합니다. 큐를 한 번 통과하면 새 메시지를 기다립니다. 그런 다음 도착함에 따라 각 새 배달 못한 편지 큐 메시지를 처리합니다.

여기에 설명된 프로세스에 개입해야 하거나 포이즌 메시지를 최종 휴식 큐에서 이동해야 하는 경우 메시지 이동기 유틸리티를 사용합니다. 메시지 이동기 유틸리티에 대한 자세한 내용은 오류 처리를 참조하세요.

클라이언트 쪽 오류

서버 쪽 오류