Antes de empezar
WebSphere Business Integration Message Broker proporciona el origen para dos nodos de ejemplo definidos por el usuario, llamados SwitchNode y TransformNode. Puede utilizar estos nodos en su estado actual, o puede modificarlos.
No desarrolle nodos Java en z/OS que tenga previsto difundir en un intermediario de una plataforma distribuida, ya que el nivel de Java en z/OS puede no generar código que sea compatible con el nivel de Java de la plataforma distribuida.
Un nodo de entrada puede recibir datos procedentes de cualquier tipo de origen externo, como un sistema de archivos, una cola o una base de datos, del mismo modo que cualquier otro programa Java, siempre que la salida del nodo tenga el formato correcto.
El usuario proporciona un almacenamiento intermedio de entrada (o corriente de bits) para contener datos de entrada y asociarlos con un objeto de mensaje. Asimismo, crea un mensaje a partir de una matriz de bytes utilizando el método createMessage de la clase MbInputNode y, a continuación, genera un conjunto de mensajes válido a partir de este mensaje (consulte el documento Java para obtener información detallada acerca de estos métodos). Por ejemplo, para leer la entrada desde un archivo:
FileInputStream inputStream = new FileInputStream("myfile.msg");
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
inputStream.close();
MbMessage msg = createMessage(buffer);
msg.finalizeMessage(MbMessage.FINALIZE_VALIDATE); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, msg);
Cuando haya creado un conjunto de mensajes, podrá propagarlo a uno de los terminales del nodo.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
La infraestructura de intermediario maneja cuestiones transaccionales, como el control de la confirmación de cualquier unidad de trabajo de WebSphere MQ o de base de datos cuando el proceso de mensajes se ha completado. No obstante, si se utiliza un nodo definido por el usuario, el intermediario no podrá confirmar automáticamente las actualizaciones de recursos.
Cada hebra de flujo de mensajes se asigna desde una agrupación de hebras mantenida para cada flujo de mensajes, y empieza a ejecutarse en el método run.
El nodo definido por el usuario utiliza valores de retorno para indicar si una transacción se ha procesado correctamente, para controlar si las transacciones se confirman o restituyen, y para verificar el momento en que la hebra se devuelve a la agrupación. Las excepciones que no se hayan manejado las recibe la infraestructura de intermediario, y la transacción se restituye.
El usuario determina el comportamiento de las transacciones y las hebras utilizando un valor de retorno adecuado de entre los siguientes:
public int run( MbMessageAssembly assembly ) throws MbException { byte[] data = getDataWithTimeout(); // 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; }
La clase mbException se utiliza para recibir excepciones y acceder a ellas. Esta clase devuelve una matriz de objetos de excepción que representan los elementos dependientes de una excepción en la lista de excepciones del intermediario. En cada elemento devuelto se especifica el tipo de excepción al que pertenece. Si una excepción no tiene elementos dependientes, se devuelve una matriz vacía. El ejemplo de código siguiente muestra un ejemplo de la utilización 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 vuelve a emitirse, debe ser la excepción original recibida } } void traverse(MbException ex, int level) { if(ex != null) { // Realizar aquí la acción necesaria 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 documento Java si desea ver más información detallada sobre cómo utilizar la clase mbException.
Puede desarrollar un nodo de proceso de mensajes o un nodo de salida definido por el usuario de manera que ambos puedan acceder a todas las excepciones actuales. Por ejemplo, para recibir excepciones de base de datos puede utilizar la clase MbSQLStatement. Esta clase establece el valor del atributo 'throwExceptionOnDatabaseError', que determina el comportamiento del intermediario cuando encuentra un error de base de datos. Si el atributo se establece en true, la extensión definida por el usuario podrá recibir y manejar una excepción que se haya emitido.
El ejemplo de código siguiente 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( "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) { // Realizar aquí el 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); }
Se muestra el panel de configuración de Java.
Una clase que implemente MbInputNodeInterface y esté incluida en la vía de acceso de clase del intermediario (o vía de acceso a la LIL), se registra con el intermediario como nodo de entrada. Al implementar MbInputNodeInterface, debe implementar también un método run para esta clase. El método run representa el inicio del flujo de mensajes, contiene los datos que formulan el mensaje y propaga el mensaje hacia abajo en el flujo de mensajes. El intermediario invoca el método run cuando las hebras se hacen disponibles, en función del modelo de trabajo con hebras especificado.
Por ejemplo, para declarar la clase de nodo de entrada:
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
Al crearse instancias del nodo, se invoca el constructor de la clase de nodo del usuario. Aquí es donde se crean los terminales del nodo, y donde se inicializan los valores por omisión para los atributos.
Un nodo de entrada está asociado a varios terminales de salida, pero normalmente no tiene ningún terminal de entrada. Utilice el método createOutputTerminal para añadir terminales de salida a un nodo cuando se creen instancias para dicho nodo. Por ejemplo, para crear un nodo con tres terminales de salida:
public BasicInputNode() throws MbException { createOutputTerminal ("out"); createOutputTerminal ("failure"); createOutputTerminal ("catch"); setAttribute ("firstParserClassName","myParser"); attributeVariable = new String ("none"); }
Es necesario declarar el nombre del nodo para que el área de trabajo lo identifique. Todos los nombres de nodo deben terminar por la palabra "Node". El nombre se declara utilizando el método siguiente:
public static String getNodeName() { return "BasicInputNode"; }
package com.ibm.pluginsamples; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
Los atributos de nodo deben declararse del mismo modo que las propiedades de Java Bean. El usuario es responsable de escribir los métodos get y set para los atributos, y la infraestructura de la API infiere los nombres de atributo utilizando las normas de introspección de Java Bean. Por ejemplo, si declara los dos métodos siguientes:
private String attributeVariable; public String getFirstAttribute() { return attributeVariable; } publc void setFirstAttribute(String value) { attributeVariable = value; }
El intermediario infiere que este nodo tiene un atributo llamado firstAttribute. Este nombre se deriva de los nombres de los métodos get y set, no de los nombres de variable de miembro de clase internos. Los atributos sólo pueden exponerse como series de caracteres, así que debe convertir los tipos numéricos a series de caracteres de los métodos get o set, o convertirlos a partir de dichas series de caracteres. Por ejemplo, el método siguiente define un atributo llamado timeInSeconds:
int seconds; public String getTimeInSeconds() { return Integer.toString(seconds); } public void setTimeInSeconds(String value) { seconds = Integer.parseInt(value); }
Como se ha descrito anteriormente, el intermediario invoca el método run para crear el mensaje de entrada. Este método deberá proporcionar todas las funciones de proceso para el nodo de entrada.
Normalmente, la implementación de un nodo de entrada determina qué analizador de mensajes analiza inicialmente un mensaje de entrada. Por ejemplo, el nodo MQInput primitivo dicta que es necesario un analizador MQMD para analizar la cabecera MQMD. Un nodo de entrada definido por el usuario puede seleccionar una cabecera o un analizador de mensajes adecuado, y la modalidad en que se controlará el análisis, utilizando los atributos siguientes que se incluyen por omisión, pero que pueden alterarse temporalmente:
El método onDelete debe implementarse como se indica a continuación:
public void onDelete() { // realizar borrado de nodo si es necesario }
Conceptos relacionados
Planificación de extensiones definidas por el usuario
Extensiones definidas por el usuario en el entorno de ejecución
Diseño de extensiones definidas por el usuario
Nodos de entrada definidos por el usuario
Tareas relacionadas
Desarrollo de extensiones definidas por el usuario
Implementación de los ejemplos proporcionados
Compilación de un nodo definido por el usuario en Java
Referencia relacionada
Nodo MQInput
Estructura de la lista de excepciones
API de nodo Java definida por el usuario
Avisos |
Marcas registradas |
Descargas |
Biblioteca |
Soporte |
Información de retorno (feedback)
![]() ![]() |
as09950_ |