Antes de começar
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.
Conceitualmente, um nó de processamento de mensagem é utilizado para processar uma mensagem de alguma forma e um nó output é utilizado para enviar uma mensagem para a saída como um fluxo de bits. Entretanto, quando se codifica um nó de processamento de mensagem ou um nó output, eles são essencialmente a mesma coisa. Você pode desempenhar o processamento de mensagens em um nó output e, de forma semelhante, pode exibir uma mensagem para um fluxo de bits utilizando um nó do processamento de mensagens. Para simplificar, este tópico refere-se principalmente ao nó como um nó de processamento de mensagem, no entanto, ele discute a funcionalidade dos dois tipos de nó.
O painel Definições Java é exibido.
Qualquer classe que implemente MbNodeInterface e que esteja contida no caminho da LIL do intermediário é registrada com o intermediário 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 intermediário para cada mensagem que é transmitida através do fluxo.
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. É aqui que são criados os terminais do nó e inicializados quaisquer valores padrão para os atributos.
Um nó de processamento de mensagem tem um número de terminais de entrada e de terminais de saída associados a ele. Os métodos createInputTerminal e createOutputTerminal são utilizados 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. Grupos de funções de utilitários são fornecidos para utilização no método evaluate. Eles são utilizados para gerenciamento de mensagens, acesso ao buffer de mensagens, navegação de elementos da sintaxe e acesso ao elemento da sintaxe.
A classe MbElement fornece a interface para os elementos de sintaxe. Para detalhes adicionais sobre a API Java, consulte o Javadoc.
Por exemplo:
A mensagem de entrada recebida é somente leitura, portanto antes 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. Os novos elementos em geral estão no domínio de um analisador.
A classe MbMessage fornece os construtores de cópia e 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)Estes métodos devem ser utilizados, porque são específicos para designação de um analisador a uma pasta da árvore de mensagens.
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 uma mensagem, você precisa decidir que dados do fluxo de mensagens deseja propagar, e qual dos terminais do nó deve receber os dados.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
Para limpar a memória que está alocada para a árvore de mensagens, chame a função clearMessage() no bloco final tentar/captar.
É necessário declarar o nome do nó como ele será identificado pelo workbench. Todos os nomes de nós devem terminar com "Node". O nome é declarado utilizando o seguinte método:
public static String getNodeName() { return "BasicNode"; }
package com.ibm.pluginsamples; public class BasicNode extends MbNode implements MbNodeInterface { ...
Os atributos do nó são declarados da mesma forma que propriedades de Java Bean. Você é responsável por escrever métodos getter e setter para os atributos e 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; } publc void setFirstAttribute(String value) { attributeVariable = value; }
O intermediário 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 para 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); }
Conforme descrito anteriormente, para nós de processamento de mensagem ou saída, você deve implementar o método evaluate definido em MbNodeInterface. Ele é chamado pelo intermediário para processar a mensagem. Esse método deve fornecer toda a função de processamento para o nó.
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 consistem na mensagem, no ambiente global, no ambiente local e na lista de exceção, são recebidos no terminal de entrada do nó.
O método onDelete é implementado da seguinte maneira:
public void onDelete() { // executar limpeza do nó se necessário }