C 입력 노드의 성능 확장

시작하기 전에

다음 주제를 읽고 이해했는지 확인하십시오.
사용자 정의 노드를 작성한 후에는 다음 옵션을 사용할 수 있습니다.
  1. 버퍼로 외부 데이터 수신
  2. 스레드 및 트랜잭션 작동 제어
  3. 메시지 전달

버퍼로 외부 데이터 수신

노드 출력이 올바른 형식으로 되어 있다면, 입력 노드는 파일 시스템이나 FTP 연결과 같은 모든 유형의 외부 소스로부터 데이터를 수신할 수 있습니다. 큐나 데이터베이스로 연결할 경우, IBM Primitive 노드 및 제공된 API 호출을 사용해야 합니다. 그 이유는 주로 기본 노드는 이미 오류 핸들링용으로 설정되어 있기 때문입니다. WebSphere MQ 큐로 직접 액세스할 때는 mqget 또는 mqput 명령을 사용하지 마십시오.

입력 데이터를 포함할 입력 버퍼(또는 비트스트림)를 제공하고 이를 메시지 오브젝트와 연관시켜야 합니다. C API에서, 버퍼는 cniSetInputBuffer 유틸리티 함수를 사용하여 입력 메시지를 나타내는 uCciMessage 오브젝트에 추가됩니다. 예를 들면,
{
    static char* functionName = (char *)"_Input_run()";
    void*        buffer;
    CciTerminal* terminalObject;
    int          buflen = 4096;
    int          rc = CCI_SUCCESS;
    int          rcDispatch = CCI_SUCCESS;
  
  buffer = readFromDevice(&buflen);
    cniSetInputBuffer(&rc, message, buffer, buflen);
}
/*propagate etc*/

스레드 및 트랜잭션 작동 제어

메시지가 메시지 플로우를 통해 전달될 때 입력 노드는 적절한 메시지 끝 처리를 수행하는 역할을 담당합니다. 특히, 입력 노드는 트랜잭션이 확약되거나 롤백되도록 하고, 스레드를 스레드 풀로 되돌려보내야 합니다.

각 메시지 플로우 스레드는 각 메시지 플로우에 유지보수되는 스레드 풀로부터 할당되며, cniRun 함수에서 실행을 시작합니다. cniDispatchThread 유틸리티 함수를 적절한 리턴 값과 함께 사용하여 스레드 동작을 판별할 수 있습니다.

cniRun 함수에서 cniDispatchThread 유틸리티 함수를 호출하여 다른 스레드가 cniRun 함수를 시작하도록 할 수 있습니다. 다른 스레드를 시작할 가장 적절한 시간은 새 스레드에서 함수가 처리할 데이터가 있다고 확인된 직후입니다.

여기서 트랜잭션이라는 용어는 일반적으로 전역 통합 트랜잭션이나 브로커가 제어하는 트랜잭션을 기술하는 데 사용됩니다. 전역 통합 트랜잭션은 z/OS에서 XA 준수 트랜잭션 관리자 또는 RRS(Resource Recovery Service)로서 WebSphere MQ에 의해 통합됩니다. WebSphere Message Broker는 데이터베이스 자원을 확약(또는 롤백)한 다음 WebSphere MQ 작업 단위를 확약하여 트랜잭션을 제어하지만, 사용자 정의 노드가 사용된 경우 브로커는 자원 갱신을 자동으로 확약하지 않습니다. 사용자 정의 노드는 리턴 값을 사용하여 트랜잭션이 성공했는지 여부를 표시하고, 트랜잭션이 확약되었는지 또는 롤백되었는지 여부를 제어합니다. 핸들링되지 않은 예외는 브로커 인프라스트럭처에서 포착되며, 트랜잭션이 롤백됩니다.

다음 표는 지원되는 리턴 값, 각각이 트랜잭션에 미치는 영향, 현재 스레드로 브로커가 수행하는 작업을 설명합니다.

리턴 값 트랜잭션에 미치는 영향 스레드의 브로커 조치
CCI_SUCCESS_CONTINUE 확약됨 cniRun 함수에서 동일한 스레드를 다시 호출합니다.
CCI_SUCCESS_RETURN 확약됨 스레드 풀로 스레드를 리턴합니다.
CCI_FAILURE_CONTINUE 롤백됨 cniRun 함수에서 동일한 스레드를 다시 호출합니다.
CCI_FAILURE_RETURN 롤백됨 스레드 풀로 스레드를 리턴합니다.
CCI_TIMEOUT 적용할 수 없음. 일반적으로 함수는 입력 메시지를 기다리는 동안 시간 종료됩니다. cniRun 함수에서 동일한 스레드를 다시 호출합니다.
다음은 cniDispatchThread 함수와 함께 SUCCESS_RETURN 리턴 코드를 사용하는 예입니다.
{
  ...
  cniDispatchThread(&rcDispatch, ((NODE_CONTEXT_ST *)context)->nodeObject);
  ...
    if (rcDispatch == CCI_NO_THREADS_AVAILABLE) return CCI_SUCCESS_CONTINUE;  
    else return CCI_SUCCESS_RETURN;
}     

메시지 전달

메시지를 전달하기 전에 전달할 메시지 플로우 데이터, 데이터를 수신할 터미널을 결정해야 합니다.

terminalObject는 사용자 정의 노드가 자체적으로 유지하는 목록에서 도출됩니다.

예를 들어, 메시지를 출력 터미널로 전달하려면 cniPropagate 함수를 사용하십시오.
    if (terminalObject) {
        if (cniIsTerminalAttached(&rc, terminalObject)) {
            if (rc == CCI_SUCCESS) {
                cniPropagate(&rc, terminalObject, destinationList, exceptionList, message);
      }
    }

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

주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as24988_