Um nó de processamento de mensagem é utilizado para processar uma mensagem e um nó de saída é utilizado para enviar uma mensagem para a saída como um fluxo de bits.
O WebSphere Message Broker fornece a origem para dois nós de amostra definidos pelo usuário chamados SwitchNode e TransformNode. Você pode utilizar esses nós em seus estados atuais ou poderá modificá-los.
Ao codificar um nó de processamento de mensagens ou um nó de saída, os dois tipos fornecem basicamente as mesmas funções. Você pode desempenhar o processamento de mensagens em um nó de saída e, da mesma forma, pode propagar uma mensagem de saída para um fluxo de bits a partir de um nó do processamento de mensagens. Para simplificar, este tópico refere-se principalmente ao nó como um nó de processamento de mensagens, mas não discute a funcionalidade dos dois tipos de nó.
Um nó Java definido pelo usuário é distribuído como um arquivo .jar.
Qualquer classe que implemente MbNodeInterface e que esteja contida no caminho da LIL do broker é registrada com o broker como um nó de processamento de mensagem. Ao implementar MbNodeInterface, você também deve implementar um método evaluate para essa classe. O método evaluate é chamado pelo broker para cada mensagem que é transmitida pelo fluxo.
O nome de classe deve terminar com a palavra "Node". Por exemplo, se você tiver designado o nome como Basic no WebSphere Message Broker Toolkit, o nome de classe deverá ser BasicNode.
package com.ibm.jplugins;
import com.ibm.broker.plugin.*;
public class BasicNode extends MbNode implements MbNodeInterface
Quando o nó é instanciado, o construtor da classe de nó do usuário é chamado. Crie os terminais do nó e inicialize quaisquer valores padrão para os atributos nesse construtor.
Um nó de processamento de mensagem tem um número de terminais de entrada e de terminais de saída associados a ele. Utilize os métodos createInputTerminal e createOutputTerminal para incluir terminais em um nó quando ele é instanciado.
Por exemplo, para criar um nó com um terminal de entrada e dois terminais de saída:
public MyNode() throws MbException
{
// criar os terminais aqui
createInputTerminal ("in");
createOutputTerminal ("out");
createOutputTerminal ("failure");
}
Em muitos casos, o nó definido pelo usuário necessita acessar o conteúdo da mensagem recebida em seu terminal de entrada. A mensagem é representada como uma árvore de elementos de sintaxe. Utilize a função de utilitário fornecida para os métodos evaluatepara gerenciamento de mensagem, acesso ao buffer de mensagem, navegação de elemento da sintaxe e acesso ao elemento da sintaxe.
A classe MbElement fornece a interface para os elementos de sintaxe.
Por exemplo:
A mensagem de entrada recebida é somente leitura, portanto, para que uma mensagem possa ser transformada, é preciso gravá-la para uma nova mensagem de saída. É possível copiar elementos da mensagem de entrada ou criar novos elementos na mensagem de saída.
A classe MbMessage fornece os construtores de cópia e os métodos para obter o elemento raiz da mensagem. A classe MbElement fornece a interface para os elementos de sintaxe.
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)
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 a mensagem, decida sobre quais dados do fluxo de mensagens você deseja propagar e se propagar para um terminal do nó ou para um nó Label.
MbOutputTerminal out = getOutputTerminal("out");
out.propagate(newAssembly);
MbRoute label1 = getRoute ("label1");
Label1.propagate(newAssembly);
Chame a função clearMessage() no bloco finally de try/catch para limpar a memória que é alocada para a árvore de mensagens.
MbMessage newMsg = new MbMessage(assembly.getMessage());
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
...
newMsg.finalizeMessage(MbMessage.FINALIZE_NONE);
out.propagate(newAssembly;
...
newMsg.finalizeMessage(MbMessage.FINALIZE_NONE);
out.propagate(newAssembly);
O nome do nó deve ser o mesmo utilizado no WebSphere Message Broker Toolkit. Todos os nomes de nós devem terminar com "Node". Declare o nome utilizando o seguinte método:
public static String getNodeName()
{
return "BasicNode";
}
package com.ibm.pluginsamples;
public class BasicNode extends MbNode implements MbNodeInterface
{
...
Declare atributos do nó da mesma forma que propriedades de Java Bean. Você deve gravar métodos getter e setter para os atributos. A estrutura da API infere os nomes dos atributos utilizando as regras de introspecção do Java Bean. Por exemplo, se você declarar os dois métodos seguintes:
private String attributeVariable;
public String getFirstAttribute()
{
return attributeVariable;
}
public void setFirstAttribute(String value)
{
attributeVariable = value;
}
O broker inferirá que esse nó tem um atributo chamado firstAttribute. Esse nome é derivado dos nomes dos métodos get ou set, não de nenhum nome de variável de membro de classe interna. Os atributos somente podem ser expostos como cadeias, portanto é preciso converter qualquer tipo numérico em cadeias e de cadeias nos métodos get ou set. Por exemplo, o método a seguir define um atributo chamado timeInSeconds:
int seconds;
public String getTimeInSeconds()
{
return Integer.toString(seconds);
}
public void setTimeInSeconds(String value)
{
seconds = Integer.parseInt(value);
}
O método evaluate, definido em MbNodeInterface, é chamado pelo broker para processar a mensagem. Toda a função de processamento do nó é incluída nesse método.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
{
// add message processing code here
getOutputTerminal("out").propagate(assembly);
}
Os dados do fluxo de mensagens, que consiste em mensagem, Environment, LocalEnvironment e ExceptionList, são recebidos no terminal de entrada do nó.
public void onDelete()
{
// executar limpeza do nó se necessário
}
Esse método é chamado pelo broker imediatamente antes de ele excluir o nó.