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

시작하기 전에

다음 주제를 읽고 이해했는지 확인하십시오.
사용자 정의 노드를 작성한 후에는 다음 기능을 사용할 수 있습니다.
  1. ESQL 액세스
  2. 예외 핸들링
  3. 출력 디바이스에 쓰기

ESQL 액세스

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

다음 프로시저에서는 ESQL을 사용하여 사용자 정의 노드의 변경 시작evaluate변경 끝 메소드에서 트랜잭션을 제어하는 방법을 보여줍니다.
  1. 사용할 ODBC 데이터 소스의 이름을 설정하십시오. 예를 들면,
    String dataSourceName = "myDataSource";
  2. 실행할 ESQL문을 설정하십시오.
    String statement =
       "SET OutputRoot.XML.data = 
              (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    또는 결과를 리턴하지 않는 명령문을 실행하는 코드는 다음과 같습니다.
    String statement = "PASSTHRU(
                            'INSERT INTO Database.Table1 VALUES(
                                 InputRoot.XML.DataField1,
                                 InputRoot.XML.DataField2)');";
  3. 다음 중 원하는 트랜잭션 유형을 선택하십시오.
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    ESQL문이 실행될 때 즉시 트랜잭션을 확약합니다.
    MbSQLStatement.SQL_TRANSACTION_AUTO
    메시지 플로우가 완료될 때 트랜잭션을 확약합니다. (필요한 경우 롤백이 수행됩니다.)
    예를 들면,
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. ESQL문을 가져옵니다. 예를 들면,
    MbSQLStatement sql =
           createSQLStatement(dataSourceName, statement, transactionType);
    createSQLStatement(dataSource, statement) 메소드를 사용하여 트랜잭션 유형의 디폴트 값을 MbSQLStatement.SQL_TRANSACTION_AUTO로 설정할 수 있습니다.
  5. 전달할 새 메시지 어셈블리를 작성합니다.
    MbMessageAssembly newAssembly =
           new MbMessageAssembly(assembly, assembly.getMessage());
  6. ESQL문을 실행합니다.
    sql.select(assembly, newAssembly);
    또는 결과를 리턴하지 않는 SQL문을 실행하는 코드는 다음과 같습니다.
    sql.execute(assembly);

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

예외 핸들링

예외를 포착하고 액세스하기 위해 MbException 클래스를 사용합니다. MbException 클래스는 브로커 예외 목록에서 예외의 하위를 표시하는 예외 오브젝트 배열을 리턴합니다. 리턴되는 각 요소는 예외 유형을 지정합니다. 예외에 하위가 없는 경우 빈 배열이 리턴됩니다. 다음 코드 샘플에서는 사용자 정의 노드의 변경 시작evaluate변경 끝 메소드에서 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' 속성 값을 설정합니다. 참으로 설정되면, 예외 발생 시 사용자 정의 확장에서 변경 시작evaluate변경 끝 메소드로 예외를 포착하여 처리할 수 있습니다.

다음 코드 샘플에서는 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( newAssembly );
}

출력 디바이스에 쓰기

출력 디바이스에 쓰려면 논리적(계층 구조) 메시지를 변경 시작evaluate변경 끝 메소드의 비트스트림으로 다시 변환해야 합니다. 이때 다음과 같이 MbMessagegetBuffer 메소드를 사용하면 됩니다.

public void evaluate( MbMessageAssembly assembly, MbInputTerminal in)
throws MbException
{
MbMessage msg = assembly.getMessage();
byte[] bitstream = msg.getBuffer();
// write the bitstream out somewhere
writeBitstream( bitstream );   // user method
}

일반적으로 출력 노드의 경우 메시지가 출력 터미널로 전달되지 않으므로 지금 리턴할 수 있습니다.

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