시작하기 전에
많은 경우, 사용자 정의 노드는 해당 입력 터미널에서 수신된 메시지의 컨텐츠에 액세스해야 합니다. 메시지는 구문 요소의 트리로 표현됩니다. 메시지 관리, 메시지 버퍼 액세스, 구문 요소 탐색, 구문 요소 액세스를 위한 유틸리티 함수 그룹이 제공됩니다.
MbElement 클래스는 구문 요소로의 인터페이스를 제공합니다. Java API에 대한 자세한 내용은 Javadoc을 참조하십시오.
예를 들면 다음과 같습니다.
수신된 입력 메시지는 읽기 전용이므로, 메시지를 변환하려면 해당 메시지를 새 출력 메시지에 써야 합니다. 입력 메시지로부터 요소를 복사하거나, 새 요소를 작성하여 메시지에 첨부할 수 있습니다. 일반적으로 새 요소는 구문 분석기 도메인에 있습니다.
MbMessage 클래스는 복사 구성자, 메시지의 루트 요소를 가져오는 메소드를 제공합니다. MbElement 클래스는 구문 요소로의 인터페이스를 제공합니다.
MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
MbElement rootElement = newAssembly.getMessage().getRootElement(); MbElement switchElement = rootElement.getFirstElementByPath("/XML/data/action");
String elementValue = (String)switchElement.getValue(); if(elementValue.equals("add")) switchElement.setValue("change"); else if(elementValue.equals("change")) switchElement.setValue("delete"); else if(elementValue.equals("delete")) switchElement.setValue("hold"); else switchElement.setValue("failure");
MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME, "PreviousValue", elementValue);
tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "NewValue", switchElement.getValue()); MbOutputTerminal out = getOutputTerminal("out");
createElementAfter createElementAsFirstChild createElementAsLastChild createElementBefore createElementAsLastChildFromBitstream메시지 트리 폴더에 구문 분석기를 지정하는 데 특정하므로 이런 메소드를 사용해야 합니다.
createElementAfter createElementAfter createElementAsFirstChild createElementAsFirstChild createElementAsLastChild createElementAsLastChild createElementBefore createElementBefore
노드는 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 클래스는 브로커 예외 목록에서 예외의 하위를 표시하는 예외 오브젝트 배열을 리턴합니다. 리턴되는 각 요소는 예외 유형을 지정합니다. 예외에 하위가 없는 경우 빈 배열이 리턴됩니다. 다음 코드 샘플에서는 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); }
메시지를 전달하기 전에 전달할 메시지 플로우 데이터, 데이터를 수신할 노드 터미널을 결정해야 합니다. 메시지를 전달하기 전에 종료해야 합니다. 메시지를 전달한 후에는 출력 메시지를 삭제해야 합니다.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
newMsg.clearMessage();
출력 디바이스에 쓰려면 논리적(계층 구조) 메시지를 비트스트림으로 다시 변환해야 합니다. 이때 다음과 같이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 }
일반적으로 출력 노드의 경우 메시지가 출력 터미널로 전달되지 않으므로 지금 리턴할 수 있습니다.