Antes de comenzar
Un nodo de entrada puede recibir datos de cualquier tipo de origen externo, por ejemplo un sistema de archivos, una cola o una base de datos, del mismo modo que cualquier otro programa Java, a condición que la salida del nodo esté en el formato correcto.
Proporcione un almacenamiento intermedio de entrada (o corriente de bits) para incluir los datos de entrada y asócielo con un objeto de mensaje. Cree un mensaje a partir de una matriz de bytes utilizando el método createMessage de la clase MbInputNode y, a continuación, genere un conjunto de mensajes válido desde este mensaje. Para obtener información detallada acerca de estos métodos, consulte la API Java. Por ejemplo, para leer la entrada de un archivo:
Cuando haya creado un conjunto de mensajes, puede propagarlo a continuación a uno de los terminales del nodo.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
La infraestructura del intermediario maneja las cuestiones relacionadas con las transacciones como, por ejemplo, el control de la confirmación de cualquier unidad de trabajo de base de datos o WebSphere MQ o cuando se ha completado el proceso de mensajes. Sin embargo, si se utiliza un nodo definido por el usuario, el intermediario no puede confirmar automáticamente las actualizaciones de recurso.
Cada hebra de flujo de mensajes se asigna de una agrupación de hebras mantenidas para cada flujo de mensajes e inicia la ejecución en el método run.
El nodo definido por el usuario utiliza los valores de retorno para indicar si una transacción se ha ejecutado satisfactoriamente, para controlar si las transacciones se han confirmado o restituido y para controlar cuándo se devuelve la hebra a la agrupación. La infraestructura del intermediario captura las excepciones no manejadas y se restituye la transacción.
Determine el comportamiento de las transacciones y las hebras utilizando un valor de retorno apropiado de los siguientes:
public int run( MbMessageAssembly assembly ) throws MbException { byte[] data = getDataWithTimeout(); // el método proporcionado por el usuario // devuelve nulo si se excede el tiempo de espera 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; }
Utilice la clase mbException para captar excepciones y acceder a ellas. La clase mbException devuelve una matriz de objetos de excepción que representan los hijos de una excepción en la lista de excepciones de intermediario. Cada elemento devuelto especifica su tipo de excepción. Si una excepción no tiene hijos, se devuelve una matriz vacía. El siguiente ejemplo de código muestra el uso de la clase MbException.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // funcionalidad de plug-in } catch(MbException ex) { traverse(ex, 0); throw ex; // si se vuelve a generar, debe ser la excepción original que se ha captado } } void traverse(MbException ex, int level) { if(ex != null) { // Aquí realizar cualquier acción System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // atravesar la jerarquía MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
Consulte el javadoc si desea ver más información detallada de la utilización de la clase mbException.
Puede desarrollar un proceso de mensaje definido por el usuario o un nodo de salida de tal forma que éste pueda acceder a todas las excepciones actuales. Por ejemplo, para captar excepciones de base de datos, puede utilizar la clase MbSQLStatement. Esta clase establece el valor del atributo 'throwExceptionOnDatabaseError', que determina el comportamiento de intermediario cuando encuentra un error de base de datos. Si se establece en verdadero, cuando se genera una excepción la extensión definida por el usuario la puede captar y manejar.
El siguiente ejemplo de código muestra cómo utilizar la clase 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) { // Aquí realizar manejo de errores 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); }