Antes de empezar
WebSphere Message Broker proporciona el origen de dos nodos de ejemplo definidos por el usuario denominados 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 algún modo y un nodo de salida se utiliza para producir un mensaje como una corriente de bits. Sin embargo, cuando se codifica un nodo de proceso de mensajes o un nodo de salida, éstos son esencialmente lo mismo. Puede realizar el proceso de 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. Aunque, para una mayor sencillez, este tema hace referencia principalmente al nodo como nodo de proceso de mensajes, describe la funcionalidad de ambos tipos de nodo.
Se visualiza el panel Valores Java.
Cualquier clase que implemente MbNodeInterface y esté contenida en la vía de acceso de LIL del intermediario se registra en el intermediario como un nodo de proceso de mensajes. Cuando implemente MbNodeInterface, también deberá implementar un método de evaluación para esta clase. El intermediario invoca el método de evaluación 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
Cuando se crea una instancia del nodo, se invoca el constructor de la clase de nodo del usuario. Aquí es donde creará los terminales del nodo e inicializará los valores por omisión para los atributos.
Un nodo de proceso de mensajes tiene asociados varios terminales de entrada y terminales de salida. Para añadir terminales a un nodo cuando se crea una instancia del nodo, se utilizan los métodos createInputTerminal y createOutputTerminal. 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"); }
En muchos casos, el nodo definido por el usuario necesita acceder al contenido del mensaje recibido en el terminal de entrada. El mensaje se representa como un árbol de elementos de sintaxis. Se proporcionan funciones de utilidad para utilizar en el método evaluate que se usan 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 a los elementos de sintaxis. Para obtener detalles adicionales de la API Java, consulte el Javadoc.
Por ejemplo:
Dado que el mensaje de entrada recibido es de sólo lectura, para poder transformar el mensaje deberá escribirlo en un nuevo mensaje de salida. Puede copiar los elementos del mensaje de entrada o puede crear nuevos elementos en el mensaje de salida. Los elementos nuevos están generalmente en el dominio de un 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 con 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");
createElementAfter(String) createElementAsFirstChild(String) createElementAsLastChild(String) createElementBefore(String) createElementAsLastChildFromBitstream(byte[], String, String, String, String, int, int, int)Deben utilizarse estos métodos porque son específicos para asignar un analizador a una carpeta de árbol de mensaje.
createElementAfter(int) createElementAfter(int, String, Object) createElementAsFirstChild(int) createElementAsFirstChild(int, String, Object) createElementAsLastChild(int) createElementAsLastChild(int, String, Object) createElementBefore(int) createElementBefore(int, String, Object)
Antes de propagar un mensaje, tiene que decidir qué datos de flujo de mensajes desea propagar y cuál de los terminales del nodo debe recibir los datos.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
Para borrar la memoria que está asignada para el árbol de mensajes, llame a la función clearMessage() dentro del bloque try/catch final.
Necesita declarar el nombre del nodo tal como lo identificará el entorno de trabajo. Todos los nombres de nodo deben terminar por "Node". Declare el nombre utilizando el método siguiente:
public static String getNodeName() { return "BasicNode"; }
package com.ibm.pluginsamples; public class BasicNode extends MbNode implements MbNodeInterface { ...
Declare los atributos de nodo del mismo modo que las propiedades de bean Java. Es responsable de escribir los métodos getter y setter para los atributos y la infraestructura de API deducirá los nombres de atributo utilizando las normas de introspección de bean Java. 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 deduce que este nodo tiene un atributo denominado firstAttribute. Este nombre se deriva de los nombres de los métodos get o set, no de los nombres de variables de miembros de clase internos. Dado que los atributos sólo se puede exponer como series de caracteres, los tipos numéricos se deben convertir a las series de caracteres o de las series de caracteres en los métodos get o set. Por ejemplo, el método siguiente define un atributo denominado timeInSeconds:
int seconds; public String getTimeInSeconds() { return Integer.toString(seconds); } public void setTimeInSeconds(String value) { seconds = Integer.parseInt(value); }
Tal como se ha descrito anteriormente, para los nodos de proceso de mensajes o de salida debe implementar el método de evaluación, definido en MbNodeInterface. El intermediario lo invoca para procesar el mensaje. Este método debe proporcionar la función de proceso completa para el nodo.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { // añadir aquí código de proceso de mensajes getOutputTerminal("out").propagate(assembly); }
Los datos de flujo de mensajes, que consta del mensaje, el entorno global, el entorno local y la lista de excepciones, se reciben en el terminal de entrada del nodo.
Implemente el método onDelete como se indica a continuación:
public void onDelete() { // realizar limpieza de nodo si es necesario }