Estendendo o Recurso de um Processamento de Mensagens Java ou de Nó Output

Antes de começar

Certifique-se de que tenha lido e entendido o seguinte tópico:
Depois de criar um nó definido pelo usuário, as seguintes funções estarão disponíveis:
  1. Acessando ESQL
  2. Tratando Exceções
  3. Gravando em um Dispositivo de Saída

Acessando ESQL

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.

O seguinte procedimento demonstra como controlar transações a partir do método evaluate no nó definido pelo usuário utilizando ESQL:
  1. Defina o nome da origem de dados ODBC a ser utilizada. Exemplo:
    String dataSourceName = "myDataSource";
  2. Defina a instrução ESQL a ser executada:
    String statement = 
          "SET OutputRoot.XML.data = 
                        (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    Ou, se quiser executar uma instrução que não retorna nenhum resultado:
    String statement = "PASSTHRU(
                                                    'INSERT INTO Database.Table1 VALUES(
                                                              InputRoot.XML.DataField1,
                                                              InputRoot.XML.DataField2)');";
  3. Selecione o tipo de transação que deseja entre os seguintes:
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    Consolide imediatamente a transação após a execução da instrução ESQL.
    MbSQLStatement.SQL_TRANSACTION_AUTO
    Consolide a transação quando o fluxo da mensagem tiver concluído. (Os retornos são executados caso necessário.)
    Exemplo:
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. Obtenha a instrução ESQL. Exemplo:
    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).
  5. Crie o novo conjunto de mensagem a ser propagado:
    MbMessageAssembly newAssembly = 
                  new MbMessageAssembly(assembly, assembly.getMessage());
  6. Execute a instrução ESQL:
    sql.select(assembly, newAssembly);
    Ou, se quiser executar uma instrução ESQL que não retorna nenhum resultado:
    sql.execute(assembly);

Para obter informações adicionais sobre ESQL, consulte Visão Geral do ESQL.

Tratando Exceções

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 );
  }

Gravando em um Dispositivo de Saída

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. Você faz isso utilizando o método getBuffer em MbMessage, da seguinte forma:

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.

Nota: É preciso utilizar o nó MQOutput fornecido ao gravar para filas do WebSphere MQ, porque o intermediário mantém internamente uma conexão ao WebSphere MQ e o identificador de filas aberto em uma base encadeamento a encadeamento, e estes são armazenados em cache para otimizar o desempenho. Além disso, o intermediário manipula cenários de recuperação quando determinados eventos WebSphere MQ ocorrem e isso seria afetado de forma adversa se chamadas WebSphere MQ MQI fossem utilizadas em um nó output definido pelo usuário.
Referências relacionadas
Estrutura da Lista de Exceções
Informações relacionadas
API de Nó Java Definido Pelo Usuário
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
as24990_