C 메시지 처리 또는 출력 노드의 성능 확장

시작하기 전에

다음 주제를 읽고 이해했는지 확인하십시오.
사용자 정의 노드를 작성한 후에는 다음 옵션을 사용할 수 있습니다.
  1. 메시지 데이터 액세스
  2. 메시지 오브젝트 변환
  3. ESQL 액세스
  4. 메시지 전달
  5. 출력 디바이스에 쓰기

메시지 데이터 액세스

대부분의 경우, 사용자 정의 노드는 해당 입력 터미널에서 수신된 메시지의 컨텐츠에 액세스해야 합니다. 메시지는 구문 요소의 트리로 표현됩니다. 메시지 관리, 메시지 버퍼 액세스, 구문 요소 탐색, 구문 요소 액세스를 위한 유틸리티 함수 그룹이 제공됩니다. (유틸리티 함수에 대한 자세한 정보는 C 노드 유틸리티 함수를 참조하십시오.)

수행할 수 있는 조회 유형은 다음과 같습니다.
  • 필수 메시지 오브젝트의 루트 요소 확보
  • 요소 트리의 비트스트림 표현에 액세스
  • 이름별로 하위 요소나 동위 요소를 요청하여 트리를 탐색하거나 조회
  • 요소 유형 가져오기
  • 요소 값 가져오기

예를 들면, 본문 첫 번째 하위 항목의 이름과 유형을 조회하는 코드는 다음과 같습니다.

void cniEvaluate( ...               
){                                    
  ...
/* Navigate to the target element */ 
    rootElement = cniRootElement(&rc, message);
    bodyElement = cniLastChild(&rc, rootElement);
    bodyFirstChild = cniFirstChild(&rc, bodyElement);

/* Query the name and value of the target element */
    cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); 
    bytes = cniElementCharacterValue(
		&rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue));
  ...    
}

요소 트리의 비트스트림 표현에 액세스하기 위해 cniElementAsBitstream 함수를 사용할 수 있습니다. 이 함수를 사용하면 메시지의 요소에 대한 비트스트림 표현을 확보할 수 있습니다. 이 함수와 샘플 코드의 사용 방법에 대한 세부사항은 cniElementAsBitstream을 참조하십시오.

메시지 오브젝트 변환

수신된 입력 메시지는 읽기 전용이므로, 메시지를 변환하려면 cniCreateMessage 함수를 사용하여 해당 메시지를 새 출력 메시지에 써야 합니다. 입력 메시지로부터 요소를 복사하거나, 새 요소를 작성하여 메시지에 첨부할 수 있습니다. 일반적으로 새 요소는 구문 분석기 도메인에 있습니다.

예를 들면,
  1. 들어오는 메시지를 새 메시지에 쓰는 코드는 다음과 같습니다.
    {
      ...
        context = cniGetMessageContext(&rc, message)); 
        outMsg = cniCreateMessage(&rc, context)); 
      ...
    }
  2. 새 메시지의 사본을 작성하려면 다음을 수행하십시오.
    cniCopyElementTree(&rc, sourceElement, targetElement);
  3. 대상 요소 값을 수정하는 코드는 다음과 같습니다.
        cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8); 
  4. 메시지를 종료하여 전달한 후에는 cniDeleteMessage 함수를 사용하여 출력 메시지를 삭제해야 합니다.
      cniDeleteMessage(&rc, outMsg);
변환의 일부로 새 메시지 본문를 작성해야 할 수도 있습니다. 새 메시지 본문를 작성하기 위해 다음 함수를 사용할 수 있습니다.
cniCreateElementAsFirstChildUsingParser
cniCreateElementAsLastChildUsingParser
cniCreateElementAfterUsingParser
cniCreateElementBeforeUsingParser
메시지 트리 폴더에 구문 분석기를 지정하는 데 특정하므로 이런 함수를 사용해야 합니다.
다음 함수는 소유하고 있는 구문 분석기를 폴더와 연관시키지 않으므로 메시지 본문을 작성할 때 사용하지 마십시오.
cniCreateElementAsFirstChild
cniCreateElementAsLastChild
cniCreateElementAfter
cniCreateElementBefore

ESQL 액세스

노드는 Compute 노드 ESQL 구문을 사용하여 ESQL 표현식을 호출할 수 있습니다. ESQL 표현식을 사용하여 메시지 구성요소를 작성하고 수정할 수 있으며, cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatementcniSqlExecute 함수를 사용하여 외부 데이터베이스의 입력 메시지 및 데이터 요소를 참조할 수 있습니다.

예를 들면, 데이터베이스 테이블의 열 컨텐츠로부터 Result 요소를 채우는 코드는 다음과 같습니다.

{
  ...
    sqlExpr = cniSqlCreateStatement(&rc, 
   (NODE_CONTEXT_ST *)context->nodeObject,
      L"DB", CCI_SQL_TRANSACTION_AUTO,
      L"SET OutputRoot.XML.Result[] = (SELECT T.C1 AS Col1 FROM Database.TABLE AS T;");
  ...
    cniSqlSelect(&rc, sqlExpr, destinationList, exceptionList, message, outMsg);
    cniSqlDeleteStatement(&rc, sqlExpr);
  ...                                                               
}

ESQL에 대한 자세한 정보는 ESQL 개요를 참조하십시오.

사용자 정의 노드가 기본적으로 ESQL을 사용하는 경우 Compute 노드 사용을 고려하십시오. Compute 노드를 참조하십시오.

메시지 전달

메시지를 전달하기 전에 전달할 메시지 플로우 데이터, 데이터를 수신할 터미널을 결정해야 합니다.
  1. 메시지가 변경된 경우, 메시지를 전달하기 전에 cniFinalize 함수를 사용하여 종료해야 합니다. 예를 들면,
                cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
  2. terminalObject는 사용자 정의 노드가 자체적으로 유지하는 목록에서 도출됩니다. 메시지를 출력 터미널로 전달하려면 cniPropagate 함수를 사용하십시오.
        if (terminalObject) {
            if (cniIsTerminalAttached(&rc, terminalObject)) {
                if (rc == CCI_SUCCESS) {
                    cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg);
          }
        }

    위의 예에서 메시지를 지정된 터미널에 전달할 수 있는지 여부를 테스트하기 위해 cniIsTerminalAttached 함수가 사용되었습니다. cniIsTerminalAttached 함수를 사용하지 않았으며 커넥터가 터미널을 다른 노드에 연결하지 않은 경우, 메시지가 전달되지 않고 경고 메시지는 리턴되지 않습니다. 이 상황이 발생하지 않도록 하려면 cniIsTerminalAttached 함수를 사용하십시오.

  3. cniCreateMessage를 사용하여 새 출력 메시지를 작성한 경우, 메시지를 전달한 후에는 cniDeleteMessage 함수를 사용하여 출력 메시지를 삭제해야 합니다.
      cniDeleteMessage(&rc, outMsg);

출력 디바이스에 쓰기

변환된 메시지는 비트스트림에 직렬화되어야 합니다. 그런 다음 비트스트림에 액세스하고 출력 디바이스에 비트스트림을 쓸 수 있습니다. cniWriteBuffer 함수를 사용하여 메시지를 비트스트림에 쓰십시오. 예를 들면,
{
  ...
    cniWriteBuffer(&rc, message);
    writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message));
  ...                                                               
}
이 예제에서 메소드 writeToDevice는 비트스트림을 출력 디바이스에 쓰는 사용자 작성 메소드입니다.

메시지는 단 한 번만 직렬화될 수 있습니.

주: WebSphere MQ 큐에 쓸 때는 제공된 MQOutput 노드를 사용해야 합니다. 브로커는 내부적으로 WebSphere MQ 연결을 유지하고, 스레드별로 큐 핸들을 열며, 성능 최적화를 위해 캐시되기 때문입니다. 또한, 브로커는 특정 WebSphere MQ 이벤트가 발생할 때 복구 시나리오를 처리하는데, 사용자 정의 출력 노드에 WebSphere MQ MQI 호출이 사용된 경우 좋지 않은 영향을 미칠 수 있습니다.
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as24989_