Antes de começar
Um nó de entrada pode receber dados de qualquer tipo de origem externa, tal como um sistema de arquivos, uma fila ou um banco de dados, da mesma maneira que qualquer outro programa Java, desde que a saída do nó esteja no formato correto.
Você fornece um buffer de entrada (ou fluxo de bits) para conter os dados de entrada e o associa a um objeto de mensagem. Você cria uma mensagem a partir de uma matriz de bytes utilizando o método createMessage da classe MbInputNode e, em seguida, gera uma montagem de mensagem válida a partir dessa mensagem. Para obter detalhes destes métodos, consulte a API Java. Por exemplo, para ler a entrada de um arquivo:
Quando tiver criado um conjunto de mensagem, você poderá propagá-lo para um dos terminais do nó.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
A infra-estrutura do intermediário trata de questões de transação tais como controlar a consolidação de qualquer unidade de trabalho do WebSphere MQ ou de banco de dados quando o processamento da mensagem estiver concluído. Entretanto, se um nó definido pelo usuário for utilizado, quaisquer atualizações de recursos não podem ser automaticamente consolidadas pelo intermediário.
Cada encadeamento do fluxo de mensagens é alocado de um conjunto de encadeamentos mantido para cada fluxo de mensagens, e inicia a execução no método run.
O nó definido pelo usuário utiliza valores de retorno para indicar se uma transação obteve êxito, para controlar se as transações são consolidadas ou retornadas e para controlar quando o encadeamento é retornado ao conjunto. Quaisquer exceções não tratadas são capturadas pela infra-estrutura do intermediário e a transação é revertida.
O comportamento das transações e encadeamentos é determinado utilizando um valor de retorno apropriado entre os seguintes:
public int run( MbMessageAssembly assembly ) throws MbException { byte[] data = getDataWithTimeout(); // usuário abasteceu método // retorna nulo se for tempo limite 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; }
Utilize a classe mbException para capturar e acessar exceções. A classe mbException retorna uma matriz de objetos de exceção que representam os filhos de uma exceção na lista de exceções do intermediário. Cada elemento retornado especifica o tipo de exceção. Uma matriz vazia será retornada se uma exceção não tiver filhos. A seguinte amostra de código mostra um exemplo do uso da classe MbException.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // funcionalidade plug-in } catch(MbException ex) { traverse(ex, 0); throw ex; // se for uma reemissão, deverá ser a exceção original capturada } } void traverse(MbException ex, int level) { if(ex != null) { // Fazer qualquer ação aqui System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // transpor a hierarquia MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
Consulte o javadoc para obter detalhes adicionais sobre o uso da classe mbException.
Você pode desenvolver um processamento de mensagens definidas pelo usuário ou nó de saída, de forma que ele possa acessar todas as exceções atuais. Por exemplo, para capturar as exceções do banco de dados você pode utilizar a classe MbSQLStatement. Essa classe define o valor do atributo 'throwExceptionOnDatabaseError', que determina o comportamento do intermediário quando ele encontra um erro no banco de dados. Quando ele for configurado como true, se uma exceção for emitida, ela poderá ser capturada e manuseada pela extensão definida pelo usuário.
A seguinte amostra de código mostra um exemplo de como utilizar a classe MbSQLStatement.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg); String table = assembly.getMessage().getRootElement().getLastChild().getFirstChild().getName(); MbSQLStatement state = createSQLStatement( "dbName", "SET OutputRoot.XML.integer[] = PASSTHRU('SELECT * FROM " + table + "');" ); state.setThrowExceptionOnDatabaseError(false); state.setTreatWarningsAsErrors(true); state.select( assembly, newAssembly ); int sqlCode = state.getSQLCode(); if(sqlCode != 0) { // Fazer tratamento de erros aqui System.out.println("sqlCode = " + sqlCode); System.out.println("sqlNativeError = " + state.getSQLNativeError()); System.out.println("sqlState = " + state.getSQLState()); System.out.println("sqlErrorText = " + state.getSQLErrorText()); } getOutputTerminal("out").propagate(assembly); }