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. 대상 요소 값을 수정하는 코드는 다음과 같습니다.
        cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8); 
  3. 메시지를 종료하여 전달한 후에는 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 개요을 참조하십시오.

메시지 전달

메시지를 전달하기 전에 전달할 메시지 플로우 데이터, 데이터를 수신할 터미널을 결정해야 합니다.
  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);
          }
        }
  3. cniCreateMessage를 사용하여 새 출력 메시지를 작성한 경우, 메시지를 전달한 후에는 cniDeleteMessage 함수를 사용하여 출력 메시지를 삭제해야 합니다.
      cniDeleteMessage(&rc, outMsg);

출력 디바이스에 쓰기

변환된 메시지는 비트스트림에 직렬화되어야 합니다. 그 다음 비트스트림에 액세스하고 출력 디바이스에 비트스트림을 쓸 수 있습니다. cniWriteBuffer 함수를 사용하여 메시지를 비트스트림에 쓰십시오. 예를 들면,
{
  ...
    cniWriteBuffer(&rc, message);
    writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message));
  ...                                                               
}
메시지는 단 한 번만 직렬화될 수 있습니다.
주: WebSphere MQ 큐에 쓸 때는 제공된 MQOutput 노드를 사용해야 합니다. 브로커는 내부적으로 WebSphere MQ 연결을 유지하고, 스레드별로 큐 핸들을 열며, 성능 최적화를 위해 캐시되기 때문입니다. 또한, 브로커는 특정 WebSphere MQ 이벤트가 발생할 때 복구 시나리오를 처리하는데, 사용자 정의 출력 노드에 WebSphere MQ MQI 호출이 사용된 경우 좋지 않은 영향을 미칠 수 있습니다.
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2005 마지막 갱신 날짜: 11/08/2005
as24989_