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 호출이 사용된 경우 좋지 않은 영향을 미칠 수 있습니다.
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as24990_