En un nodo de salida o de proceso de mensajes, puede añadir funciones ampliadas al nodo Java™.
Lea el tema Creación de un nodo de salida o de proceso de mensajes en Java.
Los nodos pueden invocar expresiones ESQL utilizando la sintaxis ESDSL del nodo Compute. Puede crear y modificar los componentes del mensaje utilizando expresiones ESQL y puede hacer referencia a los elementos del mensaje de entrada y de los datos de una base de datos externa.
String dataSourceName = "miOrigenDatos";
String statement =
"SET OutputRoot.XMLNS.data =
(SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
String statement = "PASSTHRU(
'INSERT INTO Database.Table1 VALUES(
InputRoot.XMLNS.DataField1,
InputRoot.XMLNS.DataField2)');";
int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
MbSQLStatement sql =
createSQLStatement(dataSourceName, statement, transactionType);
Puede utilizar el método createSQLStatement(data,
statement) para tomar por omisión el tipo de transacción
MbSQLStatement.SQL_TRANSACTION_AUTO).MbMessageAssembly newAssembly =
new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
Puede interactuar con bases de datos del código Java en el nodo de proceso de mensajes. El soporte que se proporciona es idéntico al soporte para el código Java que escribe para el nodo JavaCompute; para obtener detalles de las opciones disponibles y las ventajas y restricciones que se aplican, consulteInteractuar con bases de datos utilizando el nodo JavaCompute.
Utilice la clase MbException para detectar 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 código de ejemplo muestra un ejemplo de cómo podría utilizar la clase MbException en el método evaluate del nodo definido por el usuario
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());
// recorrer la jerarquía
MbException e[] = ex.getNestedExceptions();
int size = e.length;
for(int i = 0; i < size; i++)
{
traverse(e[i], level + 1);
}
}
}
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 detectar excepciones, 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, el método evaluate puede detectarla y manejarla en la extensión definida por el usuario.
El siguiente código de ejemplo muestra un ejemplo de 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( "nombreBd",
"SET OutputRoot.XMLNS.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(newAssembly);
}
Para grabar en un dispositivo de salida, es necesario volver a convertir el mensaje lógico (jerárquico) a una corriente de bits en su método evaluate. Utilice el método getBuffer en MbMessage para realizar esta tarea:
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in)
throws MbException
{
MbMessage msg = assembly.getMessage();
byte[] bitstream = msg.getBuffer();
// grabar la corriente de bits en algún lugar
writeBitstream( bitstream ); // método de usuario
}
Normalmente, dado que para un nodo de salida el mensaje no se propaga a ningún terminal de salida, simplemente puede volver a este punto.
Debe utilizar el nodo MQOutput suministrado cuando grabe en las colas de WebSphere MQ porque el intermediario mantiene una conexión de WebSphere MQ y manejadores de cola abiertos de hebra en hebra. Estos manejadores se colocan en la memoria caché para optimizar el rendimiento. Además el intermediario maneja escenarios de excepción cuando se producen determinados sucesos de WebSphere MQ y esta recuperación se ve afectada de forma adversa si se utilizan llamadas de WebSphere MQ MQI en un nodo de salida definido por el usuario.