MQInput 노드는 지속 및 트랜잭션 메시지가 포함된 오류를 핸들링할 때 다음과 같은 조치를 취합니다. 트랜잭션 메시지가 아닌 메시지의 오류는 입력 노드에서 오류 관리의 설명대로 핸들링됩니다.
이 조치는 아래의 표에 요약되어 있습니다.
오류 이벤트 | failure 터미널이 연결됨 | failure 터미널이 연결되지 않음 | catch 터미널이 연결됨 | catch 터미널이 연결되지 않음 |
---|---|---|---|---|
노드가 내부 오류를 감지함 | Failure 터미널에 연결된 플로우가 오류를 핸들링함 | 메시지를 다른 큐에 넣음. 이에 실패하면 노드가 재시도함 | 적용할 수 없음 | 적용할 수 없음 |
노드가 메시지를 out 터미널에 전달하고 out 플로우에서 예외가 발생함 | 적용할 수 없음 | 적용할 수 없음 | Catch 터미널에 연결된 플로우가 오류를 핸들링함 | 노드가 재시도함 |
노드가 메시지를 Catch 터미널에 전달하고 Catch 터미널에 연결된 플로우에서 예외가 발생함 | 오류가 작성되고 메시지를 롤백함 | 오류가 작성되고 메시지를 롤백함 | 적용할 수 없음 | 적용할 수 없음 |
노드가 메시지를 Failure 터미널에 전달하고 Failure 터미널에 연결된 플로우에서 예외가 발생함 | 적용할 수 없음 | 적용할 수 없음 | 노드가 재시도함 | 노드가 재시도함 |
노드는 메시지가 입력 큐에 롤백될 때 재시도 처리를 시도합니다. 이것은 메시지가 이전에 백아웃되었는지를 확인하고 백아웃된 경우 백아웃 수가 백아웃 임계값에 도달했는지를(임계값과 같은지) 확인합니다. 각 메시지의 백아웃 수는 MQMD의 WebSphere MQ에서 유지보수합니다.
큐 작성 시 백아웃 임계값 속성 BOTHRESH을 지정하거나 디폴트를 0으로 합니다. 디폴트 값 0을 승인하면 노드는 이것을 1로 증가시킵니다. 노드가 현재 값을 감지할 수 없는 경우에도 값을 1로 설정합니다. 이는 메시지가 이전에 백아웃되지 않은 경우 메시지가 백아웃되고 최소 한 번 재시도됨을 의미합니다.
Failure 터미널 외부에서 실패하는 경우 MQMD의 백아웃 수 필드가 입력 큐에 설정된 백아웃 임계값의 두 배에 도달할 때까지 추가 재시도가 수행됩니다. 이 한계에 도달하면 노드는 메시지를 다른 큐에 넣기 위해 시도합니다.
메시지를 제거할 수 없으므로 메시지 플로우는 계속해서 메시지 백아웃을 시도합니다. 메시지 플로우는 로컬 오류 로그에 오류를 기록하여 오류 상황을 기록합니다. 이 오류가 발생한다는 것을 알 수 있는 두 번째 내용은 입력 큐에 있는 메시지의 BackoutCount가 계속해서 증가하는 것입니다.
두 큐 모두 없어서 이러한 상황이 발생한 경우 위에서 언급된 백아웃 큐 중 하나를 정의할 수 있습니다. 메시지를 처리하지 못하게 하는 조건이 없어지면, 임시로 BOTHRESH 속성의 값을 증가시킬 수 있습니다. 그러면 메시지가 강제로 정상 처리를 거칩니다.
WebSphere MQ에서는 메시지 그룹을 지원합니다. 메시지가 그룹에 속하고 메시지 처리가 그룹의 다른 메시지에 대한 참조와 함께 완료되도록(즉, 모든 메시지가 확약되거나 롤백되도록) 지정할 수 있습니다. 그룹화된 메시지를 브로커에 송신할 때 메시지 플로우를 제대로 구성하면 이러한 조건을 확인하여 그룹 메시지 처리 중 오류가 발생하지 않습니다.
그룹화된 메시지를 올바르게 처리하도록 메시지 플로우를 구성하려면 MQInput 노드에 설명된 조치를 수행하십시오. 하지만 메시지 중 하나를 처리하는 동안 오류가 발생하면 메시지 그룹의 올바른 처리를 보장할 수 없습니다.
설명대로 MQInput 노드를 구성한 경우, 정상적인 상황에서 그룹의 모든 메시지는 그룹의 마지막 메시지의 처리가 완료될 때 확약되는 단일 작업 단위 내에서 처리됩니다. 그러나 그룹의 마지막 메시지를 처리하기 전에 오류가 발생하면 오류를 생성한 메시지를 비롯하여 마지막 메시지까지 포함하는 작업 단위는 여기에 문서화된 규칙에 정의된 오류 핸들링에 의해 처리되며, 이로 인해 작업 단위가 백아웃될 수 있습니다.
그러나 그룹 내의 나머지 메시지는 읽어서 처리할 수 있으므로 새 작업 단위에서 핸들링되어 확약됩니다. 확약은 마지막 메시지를 발견하여 처리할 때 발행됩니다. 따라서 그룹 내의 첫 번째 및 마지막이 아닌 메시지에서 오류가 발생하면, 그룹의 해당 부분은 백아웃되고 다른 부분은 확약됩니다.
메시지 처리 요구사항에서 이런 상황을 특정 방법으로 핸들링하도록 요청한 경우, 메시지 그룹 내의 오류를 핸들링할 수 있도록 추가 오류 핸들링을 제공해야 합니다. 예를 들면, 데이터베이스 내에 메시지 그룹의 실패를 기록하고, 각 메시지를 검색할 때 데이터베이스에 대한 점검을 포함시키며, 현재 그룹에서 이미 오류가 발생한 경우 강제로 롤백을 실행하도록 할 수 있습니다. 이렇게 하면 모두 성공하지 않을 경우 전체 메시지 그룹이 백아웃되고 처리되지 않습니다.