节点可以使用 Compute 节点 ESQL 语法调用 ESQL 表达式。您可以使用 ESQL 表达式创建和修改消息的组件,并可以引用外部数据库的输入消息和数据的元素。
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);您可以使用方法 createSQLStatement(dataSource, statement) 将事务类型定为缺省是 MbSQLStatement.SQL_TRANSACTION_AUTO)。
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
有关 ESQL 的更多信息,请参阅ESQL 概述。
使用 MbException 类捕获和访问异常。MbException 类返回一组异常对象,它们代表代理异常列表中异常的子代。每个返回的元素指定其异常类型。如果异常没有子代,则返回一个空数组。以下代码样本显示了如何在用户定义节点的 evaluate 方法中使用 MbException 类。
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // plug-in functionality } catch(MbException ex) { traverse(ex, 0); throw ex; // if re-throwing, it must be the original exception that was caught } } void traverse(MbException ex, int level) { if(ex != null) { // Do whatever action here System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // traverse the hierarchy MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
请参阅 javadoc,获取更多有关使用 MbException 类的详细信息。
您可以开发一个用户定义的消息过程或输出节点,通过这种方式,可以访问所有当前的异常。例如,要捕获数据库异常,您可以使用 MbSQLStatement 类。 该类设置‘throwExceptionOnDatabaseError’属性的值,当发生数据库错误时,它能够确定代理行为。当将它设置为 true 时,如果抛出异常,则用户定义的扩展中的 evaluate 方法就可以捕获并处理异常。
以下代码样本显示了如何使用 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) { // Do error handling here 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 ); }
要写到输出设备,需要用 evaluate 方法将逻辑(分层的)消息转换回位流。 您使用 MbMessage 中的 getBuffer 方法这样做,如下所示:
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // write the bitstream out somewhere writeBitstream( bitstream ); // user method }
通常,对于输出节点,消息不会传播到任何输出终端,因此您只能在这点返回。