BLOB 도메인에서 메시지 가공

이 주제에서는 BLOB 도메인에 포함된 메시지를 처리하는 데 특정한 정보 및 일반 BLOB 구문 분석기에 의해 구문 분석된 정보를 제공합니다.

BLOB 메시지는 사전정의된 구조를 갖고 있지 않으므로 BLOB 메시지의 컨텐츠를 가공할 수 없습니다. 그러나, 비트스트림 내의 알려진 위치를 사용하여 컨텐츠를 참조하고 컨텐츠에 대한 최소 지식으로 메시지를 처리할 수 있습니다.

BLOB 메시지 본문 구문 분석기는 다른 메시지 본문 구문 분석기가 수행하는 것과 동일한 방법으로 트리 구조를 작성하지 않습니다. 트리에는 데이터를 포함하는 BLOB이라고 하는 하위 요소를 갖는 BLOB 루트 요소가 있습니다.

BLOB 데이터 내의 특정 정보 조각의 위치를 알고 있을 경우, 부속 문자열을 사용하여 메시지 컨텐츠를 참조할 수 있습니다. 예를 들어, 다음과 같은 표현식은 메시지 본문의 10번째 바이트를 식별합니다.

InputBody.BLOB.BLOB[10]

다음 표현식은 오프셋 10에서 시작하는 메시지 데이터의 10바이트를 참조합니다.

SUBSTRING(InputBody.BLOB.BLOB from 10 for 10)

BLOB 메시지 가공 예

이 예에서는 가변 길이 BLOB 메시지를 가공하는 방법을 표시합니다. 이 예는 가변 길이 BLOB 메시지를 수신하고, MRM 구문 분석기를 호출하여 일부 필드를 구문 분석하며, 구문 분석된 정보에 기초하여 출력 메시지를 올바른 출력 큐로 라우트하는 메시지 플로우를 구성했다고 가정합니다.

입력 메시지는 임베드된 NULL('x00')을 포함한다고 가정하므로, 널(null) 종료된 것으로 정의될 수 없습니다.

이 예에서는 다음을 수행하는 데 필요한 ESQL을 보여줍니다.

  • BLOB 메시지 길이 계산
  • 16진 형식으로 변환
  • BLOB 메시지 시작 부분에 추가

이를 수행하여 BLOB 메시지가 다음에 오는 정수 길이 필드로 메시지 모델을 정의할 수 있습니다.

이 예에서는 BLOB 메시지를 CWF로 변환하고, 메시지를 처리하며, 추가된 길이 필드를 제거하는 방법도 보여줍니다.

이 예에서 입력 레코드의 형식은 다음과 같습니다.

  • 버전 번호: 문자열, 11자
  • 저장 번호: 문자열, 10자

    이 필드는 고객 정의 기준에 따라 다른 큐로 메시지를 라우트하는 하나의 정수로 사용됩니다.

  • 저장 데이터: 가변 길이 2진 데이터

새 메시지 정의

다음 요소 및 유형을 포함하는 새 메시지 BLOB_Example을 정의하십시오.

  • B_LEN, xsd:integer
  • VERSION_NUM, xsd:string, 길이 11
  • STORE_NUM, xsd:string, 길이 10
  • BIN_BLOB, xsd:binary, 길이 값 B_LEN

메시지 플로우 작성

이 절에서는 메시지 플로우의 특성에 대해 설명합니다. 이 예제 플로우를 구현하려면, 메시지 플로우 정의를 완료해야 하며(예를 들어, 여기에서 거짓, 알 수 없음, 실패 경우를 처리하는 데 사용되는 출력 노드를 바꾸기 위해 세 개의 서브플로우를 작성하여), 해당 전개 및 실행에 필요한 지원을 제공해야 합니다(예를 들어, 플로우를 전개하는 브로커에 대한 큐 관리자에 인바운드 및 임의의 아웃바운트 큐를 작성하여).

  1. 서브플로우 LESS_THAN 작성. 이 작업은 LESS_THAN 서브플로우 작성에 설명되어 있습니다.
  2. 새 메시지 플로우 작성 메시지 플로우 편집기 보기에 노드(MQInput 노드, Compute 노드, ResetContentDescriptor 노드, Filter 노드, 세 개의 MQOutput 노드) 및 LESS_THAN 서브플로우를 추가하십시오.
  3. MQInput 노드 이름을 INQUEUE로 변경한 후 해당 큐 이름 등록 정보를 INQUEUE로 설정하십시오.
  4. Output 터미널을 Compute 노드에 연결하십시오.
  5. Compute 노드 이름을 다폴트 값에서 Add_length로 변경하십시오. Compute 노드를 구성하여 BIN_BLOB의 길이를 계산한 후 B_LEN 필드에서 BLOB_Example 메시지 시작에 추가하십시오.
    1. 노드를 마우스 오른쪽 단추로 누르고 ESQL 열기를 누르십시오.
    2. 이 노드의 모듈에서 다음 ESQL을 코딩하십시오.
      -- Declare local variables
      DECLARE I INTEGER 1;
      DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
      DECLARE MSGLEN CHARACTER; 
      DECLARE NUMBER INTEGER; 
      DECLARE RESULT INTEGER; 
      DECLARE REM    INTEGER; 
      
      -- Copy message headers
      WHILE I < J DO
        SET OutputRoot.*[I] = InputRoot.*[I];
                SET I = I + 1;
              END WHILE;
      -- 
      -- Set MSGLEN to non NULL to avoid errors when concatenating the first time -- 
      SET MSGLEN = 'X'; 
      -- 
      -- Get the length of the BLOB and substract the length of VERSION_NUM and STORE_NUM (11+10) 
      SET NUMBER = LENGTH("InputRoot"."BLOB"."BLOB")-21; 
      -- 
      -- Convert NUMBER to hexadecimal. The remainder of dividing by 16 is calculated recursively. -- 
      WHILE NUMBER > 15 DO      
            SET RESULT = NUMBER/16;      
            SET REM    = NUMBER - RESULT*16;      
         SET MSGLEN = 
             CASE
                 WHEN REM < 10  THEN CAST(REM AS CHARACTER) || MSGLEN               
                 WHEN REM = 10  THEN 'A' || MSGLEN              
                 WHEN REM = 11  THEN 'B' || MSGLEN              
                 WHEN REM = 12  THEN 'C' || MSGLEN              
                 WHEN REM = 13  THEN 'D' || MSGLEN               
                 WHEN REM = 14  THEN 'E' || MSGLEN              
                 ELSE                'F' || MSGLEN          
            END;      
            SET NUMBER = RESULT; 
              END WHILE; 
      SET REM = NUMBER;     
      SET MSGLEN =           
            CASE                
                WHEN REM < 10  THEN CAST(REM AS CHARACTER) || MSGLEN               
                WHEN REM = 10  THEN 'A' || MSGLEN              
                WHEN REM = 11  THEN 'B' || MSGLEN              
                WHEN REM = 12  THEN 'C' || MSGLEN              
                WHEN REM = 13  THEN 'D' || MSGLEN               
                WHEN REM = 14  THEN 'E' || MSGLEN              
                ELSE                'F' || MSGLEN          
           END; 
      -- 
      -- Add leading '0's up to a length of 9 to be able to cast as BLOB. 
      -- Remember it started with MSGLEN set to X (length 1) 
      WHILE LENGTH(MSGLEN) < 9 DO       
            SET MSGLEN = '0' || MSGLEN; END WHILE; 
      -- 
      -- Change to appropriate endian (PLATFORM DEPENDENT) 
      -- If no endian swapping needed then remember to get rid of the last character as below -- 
      SET MSGLEN = SUBSTRING(MSGLEN FROM 1 FOR 8); 
      -- 
      SET MSGLEN = SUBSTRING(MSGLEN FROM 7 FOR 2) || SUBSTRING(MSGLEN FROM 5 FOR 2) ||
                                SUBSTRING(MSGLEN FROM 3 FOR 2) || SUBSTRING(MSGLEN FROM 1 FOR 2);
      SET "OutputRoot"."BLOB"."BLOB" = CAST(MSGLEN AS BLOB) || "InputRoot"."BLOB"."BLOB"; 
      
  6. Compute 노드의 Out 터미널을 ResetContentDescriptor 노드에 연결하십시오.
  7. ResetContentDescriptor 노드 이름을 ResetContent_2_MRM으로 변경하십시오. 다음과 같이 노드를 구성하십시오.
    1. 메시지 도메인MRM으로 설정하십시오.
    2. 메시지 도메인 재설정 선택란을 선택하십시오.
    3. 메시지 세트를 BLOB_Example 메시지를 정의한 메시지 세트의 ID로 설정하십시오.
    4. 메시지 세트 재설정 선택란을 선택하십시오.
    5. 메시지 유형BLOB_Example로 설정하십시오.
    6. 메시지 유형 재설정 선택란을 선택하십시오.
    7. 의 값을 사용자가 정의한 CWF 물리적 형식의 이름에 설정하십시오(예: 다폴트 값 CWF1).
    8. 메시지 형식 재설정 선택란을 선택하십시오.
  8. ResetContentDescriptor 노드의 Out 터미널을 Filter 노드에 연결하십시오.
  9. Filter 노드의 이름을 Route_2_QUEUE로 변경하십시오. 다음과 같이 노드를 구성하십시오.
    1. 노드를 마우스 오른쪽 단추로 누르고 ESQL 열기를 누르십시오.
    2. 이 노드의 ESQL 모듈에서 다음 ESQL문을 코딩하십시오.
      CAST("Body"."e_STORE_NUM" AS INTEGER) < 151    

      이 명령문은 저장 번호에서 들어오는 메시지가 151보다 작고 특정 큐로 라우트된다는 임의의 가정을 기초로 합니다. 다른 적당한 테스트를 코딩할 수도 있습니다.

  10. 다음과 같이 Filter 출력 터미널을 연결하십시오.
    1. LESS_THAN이라는 서브플로우 노드(아래 참조)에 True 터미널 연결.
    2. 큐 이름 등록 정보가 GREATER_THAN으로 설정된 GREATER_THAN이라는 MQOutput 노드에 False 터미널 연결.
    3. 큐 이름 등록 정보가 INVALID로 설정된 INVALID라는 MQOutput 노드에 Unknown 터미널 연결.
    4. 큐 이름 등록 정보가 ERROR로 설정된 ERROR라는 MQOutput 노드에 Failure 터미널 연결.

LESS_THAN 서브플로우 작성

이 서브플로우는 예상된 형식(Filter 노드에서 수행된 테스트가 참을 리턴했음)의 메시지를 핸들링합니다. 성공한 메시지는 원래 형식으로 출력 큐에 기록됩니다. 메시지가 MRM에서 BLOB으로 다시 변환되며, 추가된 4바이트(필드 B_LEN)가 제거됩니다.

이 서브플로우의 경우:

  1. LESS_THAN이라는 새 메시지 플로우를 작성하십시오.
  2. 편집기 보기에서 Input 노드, ResetContentDescriptor 노드, Compute 노드 및 MQOutput 노드를 추가하십시오.
  3. Input 노드의 이름을 InputTerminal1로 변경한 후 해당 out 터미널을 ResetContentDescriptor 노드에 연결하십시오.
  4. ResetContentDescriptor의 이름을 ResetContent_2_BLOB으로변경한 후 다음과 같이 노드를 구성하십시오.
    1. 메시지 도메인BLOB로 설정
    2. 메시지 도메인 재설정 선택란을 선택하십시오.
  5. ResetContentDescriptor 노드 out 터미널을 Compute 노드에 연결하십시오.
  6. Compute 노드의 이름을 Remove_length로 변경한 후 다음과 같이 노드를 구성하십시오.
    1. 노드를 마우스 오른쪽 단추로 누르고 ESQL 열기를 누르십시오.
    2. 이 노드의 모듈에서 다음 ESQL을 코딩하십시오.
      -- Copy message headers
      DECLARE I INTEGER 1;
      DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
      
      WHILE I < J DO
        SET OutputRoot.*[I] = InputRoot.*[I];
                SET I = I + 1;
              END WHILE;
      -- 
      -- Remove the 4 bytes length field added previously -- 
      SET "OutputRoot"."BLOB"."BLOB" = SUBSTRING("InputRoot"."BLOB"."BLOB" FROM 5);

      이 Compute 노드는 BLOB 메시지 가공을 지원하기 위해 BLOB 메시지의 시작 부분에 추가한 4바이트를 제거합니다.

      메시지에 있는 기존 헤더의 카디낼리티 값으로 초기화된 변수 J의 사용에 유의하십시오. 이는 다음 WHILE문을 코딩할 때 발생하는 루프의 각 반복에서 카디낼리티를 계산하는 것보다 더욱 효율적입니다.

      WHILE I < CARDINALITY(InputRoot.*[]) DO
  7. Compute 노드의 out 터미널을 MQOutput 노드에 연결하십시오.
  8. MQOutput 노드의 이름을 Output_success로 변경하고 큐 관리자 이름큐 이름을 설정하여 노드를 구성하십시오. 메시지 플로우 레벨에서 이러한 MQOutput 노드 등록 정보를 지정할 수 있도록 이들을 확장하는 것이 유용할 수도 있습니다.
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2005 마지막 갱신 날짜: 11/08/2005
ac11640_