Prima di iniziare
I nodi possono richiamare espressioni ESQL utilizzando la sintassi ESQL del nodo Compute. E' possibile creare e modificare i componenti del messaggio utilizzando espressioni ESQL ed è possibile fare riferimento agli elementi sia del messaggio di input che dei dati provenienti da un database esterno.
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);E' possibile utilizzare il metodo createSQLStatement(dataSource, statement) per impostare come valore predefinito il tipo di transazione su MbSQLStatement.SQL_TRANSACTION_AUTO).
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
Per ulteriori informazioni su ESQL, fare riferimento a Panoramica di ESQL.
La classe MbException viene utilizzata per acquisire ed accedere alle eccezioni. La classe MbException restituisce un array di oggetti eccezione rappresentante i child di un'eccezione nel relativo elenco del broker. Ciascun elemento restituito specifica il relativo tipo di eccezione. Se un'eccezione non ha child viene restituito un array vuoto. L'esempio di codice riportato di seguito mostra uno dei modi in cui la classe MbException può essere utilizzata nel metodo evaluate del nodo definito dall'utente.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // funzionalità plug-in } catch(MbException ex) { traverse(ex, 0); throw ex; // se in fase di rigenerazione, deve essere l'eccezione di origine acquisita } } void traverse(MbException ex, int level) { if(ex != null) { // Eseguire qui qualunque azione System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // spostamento nella gerarchia MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
Per ulteriori informazioni sull'uso della classe MbException, fare riferimento alla documentazione Java.
E' possibile sviluppare un nodo di output o di elaborazione dei messaggi definiti dall'utente in modo che possa accedere a tutte le eccezioni attuali. Ad esempio, per acquisire le eccezioni di database è possibile utilizzare la classe MbSQLStatement. Tale classe imposta il valore dell'attributo 'throwExceptionOnDatabaseError', che determina il funzionamento del broker quando rileva un errore di database. Quando è impostato su "true", se viene generata un'eccezione questa può essere acquisita e gestita dal metodo evaluate nell'estensione definita dall'utente.
L'esempio di codice riportato di seguito mostra uno dei modi in cui è possibile utilizzare la 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) { // Eseguire qui la gestione errori 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 ); }
Per scrivere su un'unità di output, il messaggio (gerarchico) logico deve essere riconvertito in un flusso di bit nel metodo evaluate. A tal fine, utilizzare il metodo getBuffer in MbMessage, come riportato di seguito:
public void evaluate(MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // scrive il flusso di bit in qualche posto writeBitstream( bitstream ); // metodo utente }
Di solito, relativamente ad un nodo di output, il messaggio non viene distribuito su alcun terminale di output, giungendo quindi a questo punto.