Un nodo de entrada se utiliza para recibir un mensaje en un flujo de mensajes, normalmente de un origen no soportado por los nodos de entrada incorporados.
Un nodo Java definido por el usuario se distribuye como un archivo .jar.
Para poder crear nodos Java en el WebSphere Message Broker Toolkit, antes debe crear un proyecto Java:
Cada 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 debe 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 con hebras especificado.
El nombre de clase debe terminar por la palabra "Node". Por ejemplo, si el nombre es BasicInput en el WebSphere Message Broker Toolkit, el nombre de clase debe ser BasicInputNode.
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
{
...
Siga estos pasos para completar esta acción en el WebSphere Message Broker Toolkit:
Cuando se crea una instancia del nodo, se llama al constructor de la clase de nodo. Esta clase es donde se crean los terminales del nodo y se inicializan los valores predeterminados 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, como un sistema de archivos, una cola o una base de datos, del mismo modo que todos los demás programas de Java, si 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 luego genere un mensaje ensamblado válido desde este mensaje. Por ejemplo, para leer los datos de entrada de un archivo:
Cuando haya creado un conjunto de mensajes, puede propagarlo a uno de los terminales de salida definidos en el nodo.
MbOutputTerminal out = getOutputTerminal("out");
out.propagate(newAssembly);
msg.clearMessage();
Para borrar la memoria que está asignada para el árbol de mensaje, llame a la función clearMessage() del bloque try/catch final.
La infraestructura de intermediario maneja las cuestiones de transacción, tales como el control de la confirmación de una unidad de trabajo de WebSphere MQ o de base de datos, cuando se ha completado el proceso de mensajes. Sin embargo, los recursos modificados desde dentro de un nodo definido por el usuario no están necesariamente bajo el control transaccional del intermediario.
Cada hebra de flujo de mensajes se asigna desde una agrupación de hebras mantenidas para cada flujo de mensajes y se inicia en el método run.
El nodo definido por el usuario utiliza valores de retorno para indicar si una transacción es satisfactoria, para controlar si las transacciones se confirman o se retrotraen y para controlar cuándo se devuelve la hebra a la agrupación. La infraestructura de intermediario detecta todas las excepciones no manejadas y retrotrae la transacción.
Determine el comportamiento de las transacciones y las hebras utilizando el valor de retorno adecuado:
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;
}
Debe declarar el nombre del nodo para que el WebSphere Message Broker Toolkit pueda utilizarlo e identificarlo. Todos los nombres de nodo deben terminar con los caracteres "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 atributos de nodo utilizando el mismo método que utiliza para las propiedades de bean de Java. Usted es responsable de escribir métodos get y set para los atributos; la infraestructura de API deduce 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;
}
public 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 variable de los miembros de clase internos. Dado que los atributos sólo se pueden exponer como series de caracteres, convierta los tipos numéricos a y desde 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 toda la función de proceso 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 incorporado 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 predeterminados siguientes que se incluyen, que se pueden alterar temporalmente:
Implemente el método onDelete del modo siguiente:
public void onDelete()
{
// realizar limpieza de nodo si es necesario
}