MQInput 오류 처리

MQInput 노드는 지속 및 트랜잭션 메시지가 포함된 오류를 핸들링할 때 다음과 같은 조치를 취합니다. 트랜잭션 메시지가 아닌 메시지의 오류는 입력 노드에서 오류 관리의 설명대로 핸들링됩니다.

이 조치는 아래의 표에 요약되어 있습니다.

오류 이벤트 failure 터미널이 연결됨 failure 터미널이 연결되지 않음 catch 터미널이 연결됨 catch 터미널이 연결되지 않음
노드가 내부 오류를 감지함 Failure 터미널에 연결된 플로우가 오류를 핸들링함 메시지를 다른 큐에 넣음. 이에 실패하면 노드가 재시도함 적용할 수 없음 적용할 수 없음
노드가 메시지를 out 터미널에 전달하고 out 플로우에서 예외가 발생함 적용할 수 없음 적용할 수 없음 Catch 터미널에 연결된 플로우가 오류를 핸들링함 노드가 재시도함
노드가 메시지를 Catch 터미널에 전달하고 Catch 터미널에 연결된 플로우에서 예외가 발생함 오류가 작성되고 메시지를 롤백함 오류가 작성되고 메시지를 롤백함 적용할 수 없음 적용할 수 없음
노드가 메시지를 Failure 터미널에 전달하고 Failure 터미널에 연결된 플로우에서 예외가 발생함 적용할 수 없음 적용할 수 없음 노드가 재시도함 노드가 재시도함

재시도 처리

노드는 메시지가 입력 큐에 롤백될 때 재시도 처리를 시도합니다. 이것은 메시지가 이전에 백아웃되었는지를 확인하고 백아웃된 경우 백아웃 수가 백아웃 임계값에 도달했는지를(임계값과 같은지) 확인합니다. 각 메시지의 백아웃 수는 MQMD의 WebSphere MQ에서 유지보수합니다.

큐 작성 시 백아웃 임계값 속성 BOTHRESH을 지정하거나 디폴트를 0으로 합니다. 디폴트 값 0을 승인하면 노드는 이것을 1로 증가시킵니다. 노드가 현재 값을 감지할 수 없는 경우에도 값을 1로 설정합니다. 이는 메시지가 이전에 백아웃되지 않은 경우 메시지가 백아웃되고 최소 한 번 재시도됨을 의미합니다.

  1. out 플로우에서 여러 번의 반복된 시도가 실패한 후 노드가 메시지를 out 터미널에 전달할 때 재시도 횟수가 백아웃 임계값 한계에 도달하면 노드는 Failure 터미널이 연결된 경우 이 터미널을 통해 메시지를 전달하려고 시도합니다. Failure 터미널에 연결되어 있지 않으면 노드는 메시지를 다른 큐에 넣기 위해 시도합니다.

    Failure 터미널 외부에서 실패하는 경우 MQMD의 백아웃 수 필드가 입력 큐에 설정된 백아웃 임계값의 두 배에 도달할 때까지 추가 재시도가 수행됩니다. 이 한계에 도달하면 노드는 메시지를 다른 큐에 넣기 위해 시도합니다.

  2. 백아웃 임계값에 도달하지 않은 경우 노드는 큐에서 다시 메시지를 가져옵니다. 이에 실패하면 위의 설명 대로 내부 오류로 처리됩니다. 여기에 성공하면 노드는 메시지를 out 플로우에 전달합니다.
  3. 백아웃 임계값에 도달한 경우
    • Failure 터미널이 연결되어 있으면 노드는 메시지를 해당 터미널에 전달합니다. 사용자가 Failure 터미널에 연결된 플로우의 오류를 핸들링해야 합니다.
    • Failure 터미널에 연결되어 있지 않으면 노드는 환경 설정의 순서 대로 메시지를 사용 가능한 큐에 넣기 위해 시도합니다.
      1. 큐가 정의되어 있지 않으면 입력 큐의 백아웃 리큐 이름(큐 속성 BOQNAME)으로 메시지를 넣습니다.
      2. 백아웃 큐를 정의하지 않은 경우 또는 이를 노드에서 식별할 수 없는 경우 데드-레터 큐(DLQ)가 정의되어 있으면 이 큐에 메시지를 놓습니다. (브로커 큐 관리자가 mqsicreatebroker 명령으로 정의된 경우, SYSTEM.DEAD.LETTER.QUEUE의 디폴트 이름이 있는 DLQ가 정의되고 이 큐 관리자에 대해 사용 가능합니다.)
      3. MQPUT 오류가 있거나(큐가 존재하지 않음을 포함) 노드에서 큐를 식별할 수 없어서 메시지를 이들 큐에 놓을 수 없는 경우 메시지는 유실 위험 없이 안전하게 처리될 수 없습니다.

        메시지를 제거할 수 없으므로 메시지 플로우는 계속해서 메시지 백아웃을 시도합니다. 메시지 플로우는 로컬 오류 로그에 오류를 기록하여 오류 상황을 기록합니다. 이 오류가 발생한다는 것을 알 수 있는 두 번째 내용은 입력 큐에 있는 메시지의 BackoutCount가 계속해서 증가하는 것입니다.

        두 큐 모두 없어서 이러한 상황이 발생한 경우 위에서 언급된 백아웃 큐 중 하나를 정의할 수 있습니다. 메시지를 처리하지 못하게 하는 조건이 없어지면, 임시로 BOTHRESH 속성의 값을 증가시킬 수 있습니다. 그러면 메시지가 강제로 정상 처리를 거칩니다.

  4. 백아웃 임계값에 두 번 도달했거나 임계값이 초과한 경우 노드는 이전 단계의 설명대로 환경 설정의 순서에 따라 메시지를 사용 가능한 큐에 넣도록 시도합니다.

메시지 그룹 오류 핸들링

WebSphere MQ에서는 메시지 그룹을 지원합니다. 메시지가 그룹에 속하고 메시지 처리가 그룹의 다른 메시지에 대한 참조와 함께 완료되도록(즉, 모든 메시지가 확약되거나 롤백되도록) 지정할 수 있습니다. 그룹화된 메시지를 브로커에 송신할 때 메시지 플로우를 제대로 구성하면 이러한 조건을 확인하여 그룹 메시지 처리 중 오류가 발생하지 않습니다.

그룹화된 메시지를 올바르게 처리하도록 메시지 플로우를 구성하려면 MQInput 노드에 설명된 조치를 수행하십시오. 하지만 메시지 중 하나를 처리하는 동안 오류가 발생하면 메시지 그룹의 올바른 처리를 보장할 수 없습니다.

설명대로 MQInput 노드를 구성한 경우, 정상적인 상황에서 그룹의 모든 메시지는 그룹의 마지막 메시지의 처리가 완료될 때 확약되는 단일 작업 단위 내에서 처리됩니다. 그러나 그룹의 마지막 메시지를 처리하기 전에 오류가 발생하면 오류를 생성한 메시지를 비롯하여 마지막 메시지까지 포함하는 작업 단위는 여기에 문서화된 규칙에 정의된 오류 핸들링에 의해 처리되며, 이로 인해 작업 단위가 백아웃될 수 있습니다.

그러나 그룹 내의 나머지 메시지는 읽어서 처리할 수 있으므로 새 작업 단위에서 핸들링되어 확약됩니다. 확약은 마지막 메시지를 발견하여 처리할 때 발행됩니다. 따라서 그룹 내의 첫 번째 및 마지막이 아닌 메시지에서 오류가 발생하면, 그룹의 해당 부분은 백아웃되고 다른 부분은 확약됩니다.

메시지 처리 요구사항에서 이런 상황을 특정 방법으로 핸들링하도록 요청한 경우, 메시지 그룹 내의 오류를 핸들링할 수 있도록 추가 오류 핸들링을 제공해야 합니다. 예를 들면, 데이터베이스 내에 메시지 그룹의 실패를 기록하고, 각 메시지를 검색할 때 데이터베이스에 대한 점검을 포함시키며, 현재 그룹에서 이미 오류가 발생한 경우 강제로 롤백을 실행하도록 할 수 있습니다. 이렇게 하면 모두 성공하지 않을 경우 전체 메시지 그룹이 백아웃되고 처리되지 않습니다.

주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
ac00414_