扩展 Java 消息处理或输出节点的功能

开始之前

确保您已阅读并理解以下主题:
创建用户定义的节点后,可以使用以下函数:
  1. 访问 ESQL
  2. 处理异常
  3. 写到输出设备

访问 ESQL

节点可以使用 Compute 节点 ESQL 语法调用 ESQL 表达式。您可以使用 ESQL 表达式创建和修改消息的组件,并可以引用外部数据库的输入消息和数据的元素。

以下过程演示了如何使用 ESQL 从 evaluate 方法控制用户定义的节点中的事务:
  1. 设置要使用的 ODBC 数据源的名称。例如:
    String dataSourceName = "myDataSource";
  2. 设置要执行的 ESQL 语句:
    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)');";
  3. 从下面选择您想要的事务类型:
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    执行 ESQL 语句时,立即提交事务。
    MbSQLStatement.SQL_TRANSACTION_AUTO
    当消息流完成时,提交事务。(若有必要,执行回滚。)
    例如:
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. 获取 ESQL 语句。例如:
    MbSQLStatement sql = 
                  createSQLStatement(dataSourceName, statement, transactionType);
    您可以使用方法 createSQLStatement(dataSource, statement) 将事务类型定为缺省是 MbSQLStatement.SQL_TRANSACTION_AUTO)。
  5. 创建要传播的新的消息集合:
      MbMessageAssembly newAssembly =
                  new MbMessageAssembly(assembly, assembly.getMessage());
  6. 执行 ESQL 语句:
    sql.select(assembly, newAssembly);
    或者,如果您要执行不返回结果的 ESQL 语句:
    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

 }

通常,对于输出节点,消息不会传播到任何输出终端,因此您只能在这点返回。

注: 当写到 WebSphere MQ 队列时,您必须使用提供的 MQOutput 节点,因为代理在内部保留了 WebSphere MQ 连结并在每线程的基础上处理打开队列,且高速缓存它们以优化性能。另外,当发生某个 WebSphere MQ 事件时,代理会处理恢复方案,如果在用户定义的输出节点中使用了 WebSphere MQ MQI 调用,则会有不利的影响。
相关参考
异常列表结构
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
as24990_