Antes de empezar
zWebSphere 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.
Conceptualmente, un nodo de proceso de mensajes se utiliza para procesar un mensaje de una forma concreta, y un nodo de salida se utiliza para producir un mensaje como corriente de bits. No obstante, al codificar un nodo de proceso de mensajes o un nodo de salida, ambos son, esencialmente, el mismo nodo. Puede procesar mensajes en un nodo de salida y, del mismo modo, puede producir un mensaje en una corriente de bits utilizando un nodo de proceso de mensajes. Para que resulte más fácil, en este tema se identifica al nodo, principalmente, con el nodo de proceso de mensajes; no obstante, se describe la funcionalidad de ambos tipos de nodo.
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.
En muchos casos, el nodo definido por el usuario necesita acceder al contenido del mensaje recibido en su terminal de entrada. El mensaje se representa como un árbol de elementos de sintaxis. Se proporcionan grupos de funciones de programas de utilidad para la gestión de mensajes, el acceso al almacenamiento intermedio de mensajes, la navegación por los elementos de sintaxis y el acceso a los elementos de sintaxis.
La clase MbElement proporciona la interfaz de los elementos de sintaxis. Si desea más información sobre la API Java, consulte el documento Java.
Por ejemplo:
MbElement rootElement = assembly.getMessage().getRootElement(); MbElement switchElement = rootElement.getLastChild().getFirstChild().getFirstChild();
String terminalName; String elementValue = (String)switchElement.getValue(); if(elementValue.equals("add")) terminalName = "add"; else if(elementValue.equals("change")) terminalName = "change"; else if(elementValue.equals("delete")) terminalName = "delete"; else if(elementValue.equals("hold")) terminalName = "hold"; else terminalName = "failure"; MbOutputTerminal out = getOutputTerminal(terminalName);
El mensaje de entrada recibido es de sólo lectura, por lo tanto, antes de transformar un mensaje debe escribirlo en un nuevo mensaje de salida. Puede copiar elementos desde el mensaje de entrada, o puede crear nuevos elementos y adjuntarlos al mensaje. Generalmente, los nuevos elementos se encuentran en un dominio de analizador.
La clase MbMessage proporciona los constructores de copia y los métodos para obtener el elemento raíz del mensaje. La clase MbElement proporciona la interfaz de los elementos de sintaxis.
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");
Los nodos pueden invocar expresiones ESQL utilizando la sintaxis ESQL del nodo Compute. Puede crear y modificar los componentes del mensaje utilizando expresiones ESQL, y puede hacer referencia a elementos del mensaje de entrada y de datos de una base de datos externa.
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);Puede utilizar el método createSQLStatement(dataSource, statement) para que el valor por omisión del tipo de transacción sea MbSQLStatement.SQL_TRANSACTION_AUTO).
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
Para obtener más información sobre ESQL, consulte el apartado ESQL.
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); }
Antes de propagar un mensaje, debe decidir qué datos de flujo de mensajes desea propagar, y cuál de los terminales del nodo va a recibir los datos. Debe finalizar el mensaje antes de propagarlo. Después de propagar un mensaje, debe suprimir el mensaje de salida.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
newMsg.clearMessage();
Para escribir en un dispositivo de salida, el mensaje lógico (jerárquico) debe volver a convertirse en una corriente de bits. Para hacerlo, debe utilizar el método getBuffer en la clase MbMessage, como se indica a continuación:
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // escribir la corriente de bits en algún lugar writeBitstream( bitstream ); // método de usuario }
Normalmente, para un nodo de salida el mensaje no se propaga a ningún terminal de salida, de modo que puede regresar simplemente a este punto.
Se muestra el panel de configuración de Java.
Una clase que implemente la interfaz MbNodeInterface y se encuentre en la vía de acceso de clase del intermediario (o vía de acceso LIL) se registra con el intermediario como nodo de proceso de mensajes. Si implementa la interfaz MbNodeInterface, debe implementar también un método evaluate para esta clase. El intermediario invoca el método evaluate para cada mensaje que pasa a través del flujo.
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicNode extends MbNode implements MbNodeInterface
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 proceso de mensajes está asociado a varios terminales de entrada y de salida. Los métodos createInputTerminal y createOutputTerminal se utilizan para añadir terminales a un nodo cuando se crean instancias para dicho nodo. Por ejemplo, para crear un nodo con un terminal de entrada y dos terminales de salida:
public MyNode() throws MbException { // crear terminales aquí createInputTerminal ("in"); createOutputTerminal ("out"); createOutputTerminal ("failure"); }
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 "BasicNode"; }
package com.ibm.pluginsamples; public class BasicNode extends MbNode implements MbNodeInterface { ...
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, para los nodos de proceso de mensajes o de salida, debe implementar el método evaluate, definido en la interfaz MbNodeInterface. El intermediario invoca este método para procesar el mensaje. Este método deberá proporcionar todas las funciones de proceso para el nodo.
Los datos de flujo de mensajes, es decir, el mensaje, el entorno global, el entorno local y la lista de excepciones se reciben en el terminal de entrada del nodo.
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 proceso de mensajes definidos por el usuario
Nodos de salida definidos por el usuario
ESQL
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
API de nodo Java definida por el usuario
Estructura de la lista de excepciones
Avisos |
Marcas registradas |
Descargas |
Biblioteca |
Soporte |
Información de retorno (feedback)
![]() ![]() |
as09970_ |