Antes de empezar
Se visualiza el panel Valores Java.
Cualquier clase que implemente MbInputNodeInterface y esté contenida en la vía de acceso de LIL del intermediario se registra en el intermediario como un nodo de entrada. Cuando implemente MbInputNodeInterface, también necesitará implementar 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 los propaga por el flujo. El intermediario invoca el método run cuando quedan hebras disponibles de acuerdo con el modelo de trabajo de 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 { ...
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 entrada tiene asociados 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 crea una instancia del 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 = "none"; }
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 mensaje ensamblado 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 mensaje ensamblado, puede propagarlo a continuación a uno de los terminales del nodo.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
msg.clearMessage();
Para borrar la memoria que está asignada para el árbol de mensajes, llame a la función clearMessage() dentro del bloque try/catch final.
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, los recursos modificados desde dentro de un nodo definido por el usuario no estarán necesariamente bajo el control transaccional del intermediario.
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; }
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 "BasicInputNode"; }
package com.ibm.pluginsamples; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
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); }
Como ya se ha descrito, el intermediario invoca el método run para crear el mensaje de entrada. Este método debe proporcionar la función de proceso completa para el nodo de entrada.
Normalmente una implementación de nodo de entrada determina qué analizador de mensajes analiza inicialmente un mensaje de entrada. Por ejemplo, el nodo MQInput primitivo indica que se necesita un analizador MQMD para analizar la cabecera MQMD. Un nodo de entrada definido por el usuario puede seleccionar un analizador de mensajes o cabeceras apropiado y la modalidad en la que se controla el análisis, utilizando los atributos siguiente que se incluyen como valores por omisión y que se pueden alterar temporalmente:
Implemente el método onDelete como se indica a continuación:
public void onDelete() { // realizar limpieza de nodo si es necesario }