Prima di iniziare
WebSphere Message Broker fornisce l'origine per due nodi definiti dall'utente di esempio denominati SwitchNode e TransformNode. E' possibile utilizzare tali nodi nel loro stato attuale oppure modificarli.
Concettualmente, un nodo di elaborazione messaggi viene utilizzato per elaborare un messaggio mentre un nodo di output viene utilizzato per eseguire l'output di un messaggio come un flusso di bit. Tuttavia, quando si codifica un nodo di elaborazione messaggi o un nodo di output, questi sono essenzialmente la stessa cosa. E' possibile eseguire l'elaborazione messaggi all'interno di un nodo di output e similmente è possibile eseguire l'output di un messaggio su un flusso di bit utilizzando un nodo di elaborazione messaggi. Per semplicità, questo argomento fa riferimento principalmente al nodo come un nodo di elaborazione messaggi, tuttavia, tratta la funzionalità di entrambi i tipi di nodo.
Viene visualizzato il pannello relativo alle impostazioni Java.
Qualsiasi classe che implementa MbNodeInterface ed è contenuta nel percorso della LIL del broker viene registrata con il broker come un nodo di elaborazione messaggi. Con l'implementazione di MbNodeInterface, è necessario implementare anche un metodo evaluate per tale classe. Il metodo evaluate viene richiamato dal broker per ciascun messaggio passato mediante il flusso.
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicNode extends MbNode implements MbNodeInterface
Quando viene creata l'istanza del nodo, viene richiamato il costruttore della classe del nodo dell'utente. Ovvero dove vengono creati i terminali del nodo e inizializzato qualsiasi valore predefinito per gli attributi.
Ad un nodo di elaborazione messaggi sono associati una serie di terminali di input e di output. I metodi createInputTerminal e createOutputTerminal vengono utilizzati per aggiungere terminali ad un nodo quando viene creata l'istanza di tale nodo. Ad esempio, per creare un nodo con un terminale di input e due terminali di output:
public MyNode() throws MbException { // create terminals here createInputTerminal ("in"); createOutputTerminal ("out"); createOutputTerminal ("failure"); }
In molti casi, il nodo definito dall'utente ha necessità di accedere al contenuto del messaggio ricevuto sul relativo terminale di input. Il messaggio è rappresentato come una struttura ad albero degli elementi di sintassi. Vengono forniti gruppi di funzioni di utilità, da usare nel metodo evaluate, utilizzati per la gestione dei messaggi, l'accesso al buffer di messaggi, la navigazione e l'acceso all'elemento di sintassi.
La classe MbElement fornisce l'interfaccia agli elementi di sintassi. Per ulteriori informazioni dettagliate su l'API Java, fare riferimento alla documentazione Java.
Ad esempio:
Il messaggio di input ricevuto è si sola lettura quindi, prima che un messaggio possa essere trasformato, è necessario scriverlo su un nuovo messaggio di output. È possibile copiare elementi dal messaggio di input o creare nuovi elementi nel messaggio di output. I nuovi elementi sono generalmente in un dominio del programma di analisi.
La classe MbMessage fornisce i costruttori di copie ed i metodi per ottenere l'elemento root del messaggio. La classe MbElement fornisce l'interfaccia agli elementi di sintassi.
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)Tali metodi devono essere utilizzati in quanto sono specifici dell'assegnazione di un programma di analisi ad una cartella della struttura ad albero del messaggio.
createElementAfter(int) createElementAfter(int, String, Object) createElementAsFirstChild(int) createElementAsFirstChild(int, String, Object) createElementAsLastChild(int) createElementAsLastChild(int, String, Object) createElementBefore(int) createElementBefore(int, String, Object)
Prima di distribuire un messaggio è necessario decidere quali dati del flusso di messaggi si desidera distribuire e quale terminale del nodo deve ricevere tali dati.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
Per svuotare la memoria assegnata all'albero del messaggio, richiamare la funzione clearMessage() all'interno del blocco finale try/catch.
E' necessario dichiarare il nome del nodo in quanto verrà identificato dal workbench. Tutti i nomi di nodo devono terminare con "Node". Si dichiara il nome utilizzando il seguente metodo:
public static String getNodeName() { return "BasicNode"; }
package com.ibm.pluginsamples; public class BasicNode extends MbNode implements MbNodeInterface { ...
Gli attributi del nodo vengono dichiarati nello stesso modo delle proprietà di Java Bean. E' sotto la propria responsabilità la scrittura di metodi per ottenere e impostare gli attributi e il framework dell'API deduce i nomi di attributo utilizzando le regole di introspezione Java Bean. Ad esempio, se si dichiarano i due seguenti metodi:
private String attributeVariable; public String getFirstAttribute() { return attributeVariable; } publc void setFirstAttribute(String value) { attributeVariable = value; }
Il broker deduce che questo nodo ha un attributo denominato firstAttribute. Tale nome viene ricavato dai nomi dei metodi "get" o "set" e non dai nomi di variabile dei membri di classe interna. Gli attributi possono essere esposti solo come stringhe, è quindi necessario convertire qualsiasi tipo numerico relativo alle stringhe in tali metodi. Ad esempio, il metodo riportato di seguito definisce un attributo denominato timeInSeconds:
int seconds; public String getTimeInSeconds() { return Integer.toString(seconds); } public void setTimeInSeconds(String value) { seconds = Integer.parseInt(value); }
Come descritto in precedenza, per i nodi di output o di elaborazione messaggi, è necessario implementare il metodo evaluate, definito in MbNodeInterface. Questo viene richiamato dal broker per elaborare il messaggio. Tale metodo deve fornire tutta la funzione di elaborazione per il nodo.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { // aggiungere qui codice di elaborazione messaggio getOutputTerminal("out").propagate(assembly); }
I dati del flusso di messaggi ovvero il messaggio, l'ambiente globale, l'ambiente locale e l'elenco di eccezioni, vengono ricevuti al terminale di input del nodo.
Il metodo onDelete viene implementato nel modo seguente:
public void onDelete() { // eseguire cleanup del nodo se necessario }