Java 입력 노드의 성능 확장

시작하기 전에

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

버퍼로 외부 데이터 수신

노드 출력이 올바른 형식으로 되어 있다면, 입력 노드는 파일 시스템, 큐 또는 데이터베이스와 같은 모든 유형의 외부 소스로부터 다른 Java 프로그램과 같은 방식으로 데이터를 수신할 수 있습니다.

입력 데이터를 포함할 입력 버퍼(또는 비트스트림)를 제공하고 이를 메시지 오브젝트와 연관시키십시오. MbInputNode 클래스의 createMessage 메소드를 사용하여 바이트 배열로부터 메시지를 작성하고 이 메시지로부터 올바른 메시지 어셈블리를 새성하십시오. 이러한 메소드에 대한 자세한 내용은 Java API를 참조하십시오. 예를 들어, 파일에서 입력을 읽으려면 다음을 수행하십시오.

  1. 파일에서 읽을 입력 스트림을 작성하십시오.
    FileInputStream inputStream = new FileInputStream("myfile.msg");
  2. 입력 파일의 크기 바이트 배열을 작성하십시오.
    byte[] buffer = new byte[inputStream.available()];
  3. 파일에서 바이트 배열로 읽으십시오.
    inputStream.read(buffer);
  4. 입력 스트림을 닫으십시오.
    inputStream.close();
  5. 큐에 넣을 메시지를 작성하십시오.
    MbMessage msg = createMessage(buffer);
  6. 이 메시지를 보유할 새 메시지 어셈블리를 작성하십시오.
    msg.finalizeMessage(MbMessage.FINALIZE_VALIDATE);
    MbMessageAssembly newAssembly =
              new MbMessageAssembly(assembly, msg);

메시지 전달

메시지 어셈블리를 작성한 경우, 이를 노드 터미널 중 하나로 전달할 수 있습니다.

예를 들어, 메시지 어셈블리를 "out" 터미널로 전달하는 코드는 다음과 같습니다.
MbOutputTerminal out = getOutputTerminal("out");
        out.propagate(newAssembly);

스레드 및 트랜잭션성 제어

브로커 인프라스트럭처는 메시지 처리가 완료되었을 때 WebSphere MQ 또는 데이터베이스 작업 단위의 확약 제어와 같은 트랜잭션 문제를 핸들링합니다. 그러나, 사용자 정의 노드가 사용된 경우, 브로커는 자원 갱신을 자동으로 확약할 수 없습니다.

각 메시지 플로우 스레드는 각 메시지 플로우에 유지보수되는 스레드 풀로부터 할당되며, run 메소드에서 실행을 시작합니다.

사용자 정의 노드는 리턴 값을 사용하여 트랜잭션이 성공했는지 여부를 표시하고, 트랜잭션이 확약되었는지 또는 롤백되었는지 여부를 제어하며, 스레드가 풀로 리턴되는 시기를 제어합니다. 핸들링되지 않은 예외는 브로커 인프라스트럭처에서 포착되며, 트랜잭션이 롤백됩니다.

다음의 적절한 리턴 값을 통해 트랜잭션 및 스레드의 작동을 판별할 수 있습니다.

MbInputNode.SUCCESS_CONTINUE
트랜잭션이 확약되고 브로커는 같은 스레드를 사용하여 run 메소드를 다시 호출합니다.
MbInputNode.SUCCESS_RETURN
트랜잭션이 확약되고, 스레드는 해당 메시지 플로우의 유일한 스레드가 아닌 것으로 간주되어 스레드 풀로 리턴됩니다.
MbInputNode.FAILURE_CONTINUE
트랜잭션이 롤백되고 브로커는 같은 스레드를 사용하여 run 메소드를 다시 호출합니다.
MbInputNode.FAILURE_RETURN
트랜잭션이 롤백되고, 스레드는 해당 메시지 플로우의 유일한 스레드가 아닌 것으로 간주되어 스레드 풀로 리턴됩니다.
MbInputNode.TIMEOUT
run 메소드는 입력 데이터가 도착할 때까지 기다리는 동안 무한정 블록 상태로 있어서는 안 됩니다. 사용자 코드가 플로우를 블록킹하는 동안 브로커를 종료하거나 재구성할 수 없습니다. run 메소드는 run 메소드로부터 리턴하여 정기적으로 브로커로 제어를 보내야 합니다. 특정 기간(예: 5초) 후에 입력 데이터가 수신되지 않으면, TIMEOUT 리턴 코드가 표시되면서 메소드가 리턴됩니다. 브로커를 재구성하거나 종료할 필요가 없다고 간주하고, 입력 노드의 run 메소드가 즉시 다시 호출됩니다.
멀티스레드 메시지 플로우를 작성하려면 메시지가 작성된 후 그 메시지가 출력 터미널로 전달되기 전에 dispatchThread 메소드를 호출하십시오. 그러면 다른 스레드가 메시지를 처리하는 동안 단 하나의 스레드만이 데이터를 기다리게 됩니다. 메시지 플로우의 additionalInstances 속성이 지정하는 최대 한계까지 스레드 풀로부터 새 스레드가 취득됩니다. 예를 들면,
public int run( MbMessageAssembly assembly ) throws MbException
{
    byte[] data = getDataWithTimeout();  // user supplied method
                                                                              // returns null if timeout
    if( data == null )
        return TIMEOUT;

    MbMessage msg = createMessage( data );
    msg.finalizeMessage( MbMessage.FINALIZE_VALIDATE );
  MbMessageAssembly newAssembly =
              new MbMessageAssembly( assembly, msg );

    dispatchThread();

    getOutputTerminal( "out" ).propagate( newAssembly );

    return SUCCESS_RETURN;
}

예외 핸들링

예외를 포착하고 액세스하기 위해 mbException 클래스를 사용합니다. mbException 클래스는 브로커 예외 목록에서 예외의 하위를 표시하는 예외 오브젝트 배열을 리턴합니다. 리턴되는 각 요소는 예외 유형을 지정합니다. 예외에 하위가 없는 경우 빈 배열이 리턴됩니다. 다음 코드 샘플에서는 MbException 클래스의 사용법 예를 보여줍니다.

public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
  {
    try
      {

                // plug-in functionality

      }
        catch(MbException ex)
      {
                traverse(ex, 0);

                throw ex; // if re-throwing, it must be the original exception that was caught
      }
  }

    void traverse(MbException ex, int level)
  {
        if(ex != null)
      {
                // Do whatever action here
                System.out.println("Level: " + level);
                System.out.println(ex.toString());
                System.out.println("traceText:  " + ex.getTraceText());

                // traverse the hierarchy
                MbException e[] = ex.getNestedExceptions();
                int size = e.length;
                for(int i = 0; i < size; i++)
          {
                        traverse(e[i], level + 1);
          }
      }
  }

mbException 클래스의 사용에 대한 자세한 정보는 javadoc를 참조하십시오.

모든 현재 예외에 액세스할 수 있도록 사용자 정의 메시지 처리 또는 출력 노드를 개발할 수 있습니다. 예를 들어, 데이터베이스 예외를 포착하기 위해 MbSQLStatement 클래스를 사용할 수 있습니다. 이 클래스는 데이터베이스 오류 발생 시 브로커 작동을 판별하는 'throwExceptionOnDatabaseError' 속성 값을 설정합니다. 참으로 설정되면 예외가 발생할 경우 사용자 정의 확장으로 예외를 포착하여 처리할 수 있습니다.

다음 코드 샘플에서는 MbSQLStatement 클래스의 사용 방법 예를 보여줍니다.

public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
  {
        MbMessage newMsg = new MbMessage(assembly.getMessage());
        MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);

        String table = assembly.getMessage().getRootElement().getLastChild().getFirstChild().getName();

        MbSQLStatement state = createSQLStatement( "dbName", 
                                                      "SET OutputRoot.XML.integer[] = PASSTHRU('SELECT * FROM " + table + "');" );

        state.setThrowExceptionOnDatabaseError(false);
        state.setTreatWarningsAsErrors(true);

        state.select( assembly, newAssembly );

        int sqlCode = state.getSQLCode();
        if(sqlCode != 0)
      {
                // Do error handling here

                System.out.println("sqlCode = " + sqlCode);
                System.out.println("sqlNativeError = " + state.getSQLNativeError());
                System.out.println("sqlState = " + state.getSQLState());
                System.out.println("sqlErrorText = " + state.getSQLErrorText());
      }

        getOutputTerminal("out").propagate(assembly);
  }
관련 정보
Java API
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2005 마지막 갱신 날짜: 11/08/2005
as24987_