[UNIX, Linux, Windows, IBM i]

보고서 및 세그먼트된 메시지

메시지가 세그먼트화되고 보고서 생성을 요청하는 경우, 메시지가 세그먼트화되지 않았던 경우보다 더 많은 보고서를 수신할 수 있습니다. 세그먼트화된 메시지에 대한 보고서는 멀티플랫폼에서만 사용 가능합니다.

분할된 메시지에 대한 설명은 다음을 참조하세요. 메시지 세분화.

IBM MQ 에서 생성된 보고서의 경우

메시지를 세그먼트하거나 큐 관리자가 대신 수행하도록 허용하는 경우에만 전체 메시지에 대해 단일 보고서를 수신할 것으로 예상할 수 있습니다. 이는 COD 보고서만 요청했으며 가져오기 애플리케이션에 MQGMO_COMPLETE_MSG를 지정한 경우입니다.

다른 경우에는 애플리케이션이 여러 보고서를 처리하도록 준비되어 있어야 합니다. 보통 각 세그먼트당 하나씩입니다.

참고: 메시지를 세그먼트화하고 원래 메시지 데이터의 처음 100바이트만 리턴해야 하는 경우, 보고서 옵션의 설정을 변경하여 오프셋이 100이상인 세그먼트에 대한 데이터가 없는 보고서를 요청하십시오. 이를 수행하지 않고, 각 세그먼트에서 100바이트의 데이터를 요청하도록 설정을 그대로 둔 상태로 MQGMO_COMPLETE_MSG를 지정하는 단일 MQGET을 사용하여 보고 메시지를 검색하는 경우, 보고서는 각각의 해당 오프셋에서 100바이트의 읽기 데이터를 포함하는 대형 메시지를 작성합니다. 이러한 경우 대형 버퍼가 필요하거나 MQGMO_ACCEPT_TRUNCATED_MSG를 지정해야 합니다.

애플리케이션에서 생성하는 보고서의 경우

애플리케이션이 보고서를 생성하는 경우 항상 원래 메시지 데이터의 시작 부분에 있는 IBM MQ 헤더를 보고 메시지 데이터에 복사하십시오.

그런 다음, 없음, 100바이트 또는 모든 원본 메시지 데이터(또는 일반적으로 포함하는 다른 양)를 보고 메시지 데이터에 추가하십시오.

MQMD로 시작하고 존재하는 헤더를 통해 계속되는 연속 형식 이름을 확인하여 복사해야 하는 IBM MQ 헤더를 인식할 수 있습니다. 다음 Format 이름은 이러한 IBM MQ 헤더를 표시합니다.
  • MQMDE
  • MQDLH
  • MQXQH
  • MQIIH
  • MQH*
MQH*는 문자 MQH으로 시작하는 모든 이름을 의미합니다.

Format 이름은 MQDLH및 MQXQH의 특정 위치에서 발생하지만 다른 IBM MQ 헤더의 경우 동일한 위치에서 발생합니다. 헤더의 길이는 MQMDE, MQIMS및 모든 MQH* 헤더에 대해 동일한 위치에서도 발생하는 필드에 포함됩니다.

버전 1 MQMD를 사용 중이며 세그먼트, 그룹의 메시지 또는 세그먼트화가 허용되는 메시지에서 보고하는 경우 보고서 데이터는 MQMDE로 시작해야 합니다. OriginalLength 필드를 찾은 IBM MQ 헤더의 길이를 제외한 원래 메시지 데이터의 길이로 설정하십시오.

보고서 검색

COA 또는 COD 보고서를 요청하는 경우 보고서가 MQGMO_COMPLETE_MSG로 리어셈블링되도록 요청할 수 있습니다.

MQGMO_COMPLETE_MSG가 포함된 MQGET은 하나의 완전한 원본 메시지를 표현하기 위해 충분한 보고 메시지(COA와 같은 단일 유형이고 동일한 GroupId가 있는 메시지)가 큐에 제공되는 경우에 충족됩니다. 이는 보고 메시지 자체에 전체 원본 데이터가 포함되어 있지 않은 경우에도 동일합니다. 데이터 자체가 없는 경우라도 각 보고 메시지의 OriginalLength 필드는 해당 보고 메시지에서 표현하는 원래 데이터의 길이를 제공합니다.

동일한 Feedback 코드를 갖는 경우에만 MQGMO_COMPLETE_MSG가 포함된 MQGET에서 보고 메시지를 리어셈블링하기 때문에 큐에 여러 다른 유형의 보고서 유형이 있는 경우(예를 들어, COA 및 COD 둘 다)에도 이 기술을 사용할 수 있습니다. 그러나 예외 보고서에는 이 기술을 사용할 수 없습니다. 일반적으로 예외 보고서에는 다른 Feedback 코드가 있기 때문입니다.

전체 메시지가 도착했다는 긍정적인 표시를 얻기 위해 이 기술을 사용할 수 있습니다. 그러나 대부분의 상황에서 다른 세그먼트가 예외(또는 종료, 허용한 경우)를 생성할 수 있는 동안 일부 세그먼트의 도달 가능성을 만족시켜야 합니다. 이러한 경우 MQGMO_COMPLETE_MSG를 사용할 수 없습니다. 일반적으로 다른 세그먼트에 대해서는 다른 Feedback 코드를 얻을 수 있으며 세그먼트에 대해 하나 이상의 보고서를 얻을 수 있기 때문입니다. 그러나 MQGMO_ALL_SEGMENTS_AVAILABLE은 사용할 수 있습니다.

이를 허용하려면, 보고서가 도착할 때 보고서를 검색해야 할 수 있으며 원래 메시지에 발생한 내용의 그림을 애플리케이션에서 빌드해야 할 수 있습니다. 보고 메시지의 GroupId 필드를 사용하여 원래 메시지의 GroupId와 보고서를 상관시키고 Feedback 필드를 사용하여 각 보고 메시지의 유형을 식별할 수 있습니다. 이를 수행하는 방법은 애플리케이션 요구사항에 따라 다릅니다.

한 가지 접근법은 다음과 같습니다.
  • COD 보고서 및 예외 보고서를 요청하십시오.
  • 정해진 시간이 지난 후 MQGMO_COMPLETE_MSG를 사용하여 전체 COD 보고서 세트가 수신되었는지 확인하십시오. 해당되는 경우 애플리케이션은 전체 메시지가 처리되었음을 인지하고 있습니다.
  • 수신되지 않고 이 메시지와 관련된 예외 보고서가 있는 경우에는 세그먼트되지 않은 메시지에 대한 문제점을 처리하십시오. 그러나 일부 지점에서 고아(orphan) 세그먼트를 정리해야 합니다.
  • 어떠한 종류의 보고서도 없는 세그먼트가 있다면 원래 세그먼트가 채널이 다시 연결되기를 기다리고 있거나 네트워크에서 일부 지점에 과부하가 발생했을 수 있습니다. 예외 보고서가 전혀 수신되지 않았다면(또는 임시 보고서만 수신되었다고 생각하는 경우) 애플리케이션을 좀 더 대기하도록 결정할 수 있습니다.

    이전과 같이, 고아 세그먼트를 정리해야 할 수 있다는 점을 제외하고는 세그먼트되지 않은 메시지를 처리할 때의 고려사항과 유사합니다.

원본 메시지가 중요하지 않은 경우(예를 들어, 나중에 반복될 수 있는 메시지나 조회인 경우) 고아 세그먼트가 제거되었는지 확인하도록 만기 시간을 설정하십시오.

이전 레벨 큐 관리자

세그먼트화를 지원하는 큐 관리자가 보고서를 생성하지만 세그먼트화를 지원하지 않는 큐 관리자에서 보고서를 수신하는 경우 MQMDE 구조(보고서에 의해 표시되는 OffsetOriginalLength를 식별함)는 0(제로), 100바이트 또는 메시지의 원래 데이터 모두와 함께 항상 보고서 데이터에 포함됩니다.

그러나 메시지의 세그먼트가 세그먼트화를 지원하지 않는 큐 관리자를 통해 전달되는 경우 보고서가 해당 큐 관리자에 생성된다면 원래 메시지의 MQMDE 구조는 순수하게 데이터로 처리됩니다. 따라서 원래 데이터의 0바이트가 요청되었다면 보고서 데이터에 포함되지 않습니다. MQMDE 없이는 보고 메시지가 유용하지 않을 수 있습니다.

메시지가 이전 레벨 큐 관리자를 통해 이동할 가능성이 있는 경우 보고서에서 최소한 100바이트 이상의 데이터를 요청하십시오.