시작하기 전에
노드는 Compute 노드 ESQL 구문을 사용하여 ESQL 표현식을 호출할 수 있습니다. ESQL 표현식을 사용하여 메시지 구성요소를 작성하고 수정할 수 있으며, 외부 데이터베이스의 입력 메시지 및 데이터 요소를 참조할 수 있습니다.
String dataSourceName = "myDataSource";
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)');";
int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
MbSQLStatement sql = createSQLStatement(dataSourceName, statement, transactionType);createSQLStatement(dataSource, statement) 메소드를 사용하여 트랜잭션 유형의 디폴트 값을 MbSQLStatement.SQL_TRANSACTION_AUTO로 설정할 수 있습니다.
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
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 메소드의 비트스트림으로 다시 변환해야 합니다. 이때 다음과 같이MbMessage의 getBuffer 메소드를 사용하면 됩니다.
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 }
일반적으로 출력 노드의 경우 메시지가 출력 터미널로 전달되지 않으므로 지금 리턴할 수 있습니다.