Antes de começar
Os nós podem chamar expressões ESQL utilizando sintaxe ESQL de 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.XML.data = (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
String statement = "PASSTHRU( 'INSERT INTO Database.Table1 VALUES( InputRoot.XML.DataField1, InputRoot.XML.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);
Para obter informações adicionais sobre ESQL, consulte Visão Geral do ESQL.
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 de como 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); } } }
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ó output, 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
pelo método evaluate
na 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( newAssembly ); }
Para gravar em um dispositivo de saída, a mensagem lógica (hierárquica)
precisa ser convertida de volta para um fluxo de bits no método evaluate
.
Isso é feito utilizando o método
getBuffer em
MbMessage, da seguinte maneira:
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ó output a mensagem não é propagada para nenhum terminal de saída, portanto você pode somente retornar neste ponto.