다음을 통해 공유


영구 Client-Side 실패

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

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

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

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

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

위의 단계 중 하나라도 실패하면 메시지는 Xact 배달 못 한 편지 큐에 남아 있습니다.

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

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

Client-Side 오류

Server-Side 오류