Dentro de um processamento de mensagens ou nó de saída, é possível incluir funções estendidas em seu nó Java.
Leia Criando um Processamento de Mensagem ou Nó de Saída em Java.
Os nós podem chamar expressões ESQL que utilizam a sintaxe ESQL do nó Compute. É possível criar e modificar os componentes da mensagem utilizando expressões ESQL, e referir-se a elementos da mensagem de entrada e dos dados a partir de um banco de dados externo.
String dataSourceName = "myDataSource";
String statement = "SET OutputRoot.XMLNS.data = (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
String statement = "PASSTHRU( 'INSERT INTO Database.Table1 VALUES( InputRoot.XMLNS.DataField1, InputRoot.XMLNS.DataField2)');";
int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
MbSQLStatement sql = createSQLStatement(dataSourceName, statement, transactionType);Você pode utilizar o método createSQLStatement(dataSource, statement para definir o tipo de transação como o padrão de MbSQLStatement.SQL_TRANSACTION_AUTO).
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
Utilize a classe MbException para capturar e acessar as 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 amostra de código a seguir mostra um exemplo de como você poderia utilizar a classe MbException no método evaluate do nó definido pelo usuário.
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); } } }
É possível desenvolver um processamento de mensagens definido pelo usuário ou nó de saída de maneira que 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 configurado como true, se uma exceção for lançada, ela poderá ser capturada e tratada pelo método evaluate em sua extensão definida pelo usuário.
A amostra de código a seguir 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.XMLNS.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( newAssembly ); }
Para gravar em um dispositivo de saída, a mensagem lógica (hierárquica) precisa ser convertida novamente em um fluxo de bits no método evaluate. Utilize o método getBuffer no MbMessage para executar esta tarefa:
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // gravar o fluxo de bits para algum lugar writeBitstream( bitstream ); // user method }
Em geral, para um nó de saída , a mensagem não é propagada para nenhum terminal de saída, portanto, você pode somente retornar neste ponto.
Você deve utilizar o nó MQInput fornecido ao gravar nas filas WebSphere MQ, porque o intermediário mantém internamente uma conexão WebSphere MQ e a fila aberta é tratada com base em encadeamento-por-encadeamento. Esses tratamentos são armazenados em cache para otimizar o desempenho. Além disso, o intermediário trata dos cenários de exceção quando ocorrerem determinados eventos WebSphere MQ, e esta recuperação é afetada de forma adversa se as chamadas WebSphere MQ MQI forem utilizadas em um nó de saída definida pelo usuário.