시작하기 전에
노드 출력이 올바른 형식으로 되어 있다면, 입력 노드는 파일 시스템, 큐 또는 데이터베이스와 같은 모든 유형의 외부 소스로부터 다른 Java 프로그램과 같은 방식으로 데이터를 수신할 수 있습니다.
입력 데이터를 포함할 입력 버퍼(또는 비트스트림)를 제공하고 이를 메시지 오브젝트와 연관시키십시오. MbInputNode 클래스의 createMessage 메소드를 사용하여 바이트 배열로부터 메시지를 작성하고 이 메시지로부터 올바른 메시지 어셈블리를 새성하십시오. 이러한 메소드에 대한 자세한 내용은 Java API를 참조하십시오. 예를 들어, 파일에서 입력을 읽으려면 다음을 수행하십시오.
메시지 어셈블리를 작성한 경우, 이를 노드 터미널 중 하나로 전달할 수 있습니다.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
브로커 인프라스트럭처는 메시지 처리가 완료되었을 때 WebSphere MQ 또는 데이터베이스 작업 단위의 확약 제어와 같은 트랜잭션 문제를 핸들링합니다. 그러나, 사용자 정의 노드가 사용된 경우, 브로커는 자원 갱신을 자동으로 확약할 수 없습니다.
각 메시지 플로우 스레드는 각 메시지 플로우에 유지보수되는 스레드 풀로부터 할당되며, run 메소드에서 실행을 시작합니다.
사용자 정의 노드는 리턴 값을 사용하여 트랜잭션이 성공했는지 여부를 표시하고, 트랜잭션이 확약되었는지 또는 롤백되었는지 여부를 제어하며, 스레드가 풀로 리턴되는 시기를 제어합니다. 핸들링되지 않은 예외는 브로커 인프라스트럭처에서 포착되며, 트랜잭션이 롤백됩니다.
다음의 적절한 리턴 값을 통해 트랜잭션 및 스레드의 작동을 판별할 수 있습니다.
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); }