Resolvendo Problemas com Extensões Definidas pelo Usuário

Orientação para lidar com alguns problemas comuns que podem surgir ao trabalhar com extensões definidas pelo usuário.

Não é Possível Implementar um dos Nós Definidos pelo Usuário, Apesar de Existir um Plug-in LIL no Diretório Correto.

  • Cenário: Não é possível implementar um dos nós definidos pelo usuário, apesar de existir um plug-in LIL no diretório correto.
  • Explicação: Você utilizou memset() para definir a área de dados como zero e não inicializou a estrutura CNI_VFT com a constante de inicialização {CNI_VFT_DEFAULT}.
  • Solução: Inicialize, copiando uma estrutura de inicialização predefinida sobre a área da tabela de funções, da seguinte forma:
    static CNI_VFT	virtualFunctionTable = {CNI_VFT_DEFAULT};

    Além disso, implemente o registro a partir do nó definido pelo usuário para que seja possível ver se a API do plug-in está produzindo códigos de erro; o intermediário não registra esses erros em seu próprio registro, a menos que você utilize um rastreio de serviço.

Não É Possível Implementar um Fluxo Contendo um de seus Nós Definidos pelo Usuário.

  • Cenário: Você não pode implementar um fluxo contendo um de seus nós definidos pelo usuário.
  • Explicação: Seu arquivo LIL falhou no carregamento.
  • Solução: Verifique o registro do sistema (syslog ou Eventviewer) da inicialização do intermediário; você recebeu uma mensagem BIP2308 dizendo que um arquivo LIL falhou no carregamento? Se houver algum problema no carregamento de um arquivo LIL, uma mensagem BIP2308 aparecerá no registro do sistema.

Você Obtém Problemas Quando os Nós Tentam Utilizar a Interface de Caminho ESQL na API de Plug-in

  • Cenário: Na tentativa de utilizar a interface de caminho ESQL na API de plug-in, o valor de retorno é CCI_PATH_NOT_NAVIGABLE.
  • Explicação: A API do plug-in permite especificar um caminho na forma de uma expressão de caminho ESQL e navegar a esse elemento, retornando um manuseio, se existir. Também permite criar elementos juntamente com o caminho ao elemento solicitado.

    A função de utilitário do caminho de navegação (cniSqlNavigatePath) executa o SQLPathExpression criado com as funções de utilitário cniSqlCreateReadOnlyPathExpression ou cniSqlCreateModifiablePathExpression, conforme definido pelo argumento sqlPathExpression.

    Se o caminho não for navegável, o código de retorno é definido como CCI_PATH_NOT_NAVIGABLE. Ele pode ser retornado ao incorporar uma expressão de caminho a outra expressão de caminho. As funções cciMessage* de entrada não devem ser NULL; no entanto, qualquer uma das funções cciMessage* de saída pode ser NULL. Se você incorporou uma expressão de caminho que pode ser NULL em uma expressão de caminho que não pode ser NULL, CCI_PATH_NOT_NAVIGABLE é retornado.

  • Solução: Se o código de retorno for definido como CCI_PATH_NOT_NAVIGABLE, assegure-se de que, se um nome de correlação for especificado em um caminho, o respectivo parâmetro não é NULL.

Interpretando Problemas com Extensões Definidas pelo Usuário

  • Cenário: Você deseja depurar problemas nos nós e analisadores definidos pelo usuário.
  • Solução: Inicie o rastreio do usuário em nível de depuração. Para ver as mensagens BIP4142, BIP4144, BIP4145 e BIP4146, isso deve ser feito no nível do grupo de execução. Por exemplo, utilize o comando mqsichangetrace sem o parâmetro -f.
    As mensagens de depuração a seguir ajudam a compreender a execução de nós e analisadores definidos pelo usuário:
    • BIP2233 e BIP2234: um par de mensagens que são rastreadas antes e depois da chamada de uma função de implementação da extensão definida pelo usuário. Essas mensagens informam os parâmetros de entrada e o valor retornado. Por exemplo:

      BIP2233 Chamando a função de extensão definida pelo usuário [nome da função] ([parâmetros de chamadas de função])

      BIP2234 Retornada da função de extensão definida pelo usuário [nome da função] com o resultado: [resultado da chamada]
      Nota: Nessas mensagens, uma função de implementação pode ser interpretada como uma função de implementação C ou um método de implementação Java.
    • BIP2308: uma mensagem que é registrada quando o intermediário falha ao carregar um arquivo LIL.

      BIP2308 O arquivo [nome do arquivo LIL] não pôde ser carregado; código de retorno do sistema operacional [código de erro retornado do sistema operacional]

    • BIP3904: uma mensagem rastreada antes de chamar o método evaluate() Java de um nó definido pelo usuário. Por exemplo:

      BIP3904 (para Java): Chamando o método evaluate() do nó (class=[node class name], name=[label of node in flow]) em que nome da classe do nó é o nome da classe de extensão Java definida pelo usuário.

    • BIP3905: uma mensagem rastreada antes de chamar a função de implementação C cniEvaluate (membro iFpEvaluate de CNI_VFT) de um nó definido pelo usuário. Por exemplo:

      BIP3905 (para C): Chamando a função de implementação cniEvaluate() do nó (class=[node class name], name=[label of node in flow]), em que nome da classe do nó é o nome da classe de extensão definida pelo usuário que é fornecido pela extensão definida pelo usuário enquanto chama C cniDefineNodeClass.

    • BIP4142: uma mensagem de depuração rastreada durante a chamada de uma função de utilitário do nó definido pelo usuário, onde a função de utilitário altera o estado de um elemento de sintaxe. Isto inclui todas as funções de utilitário que começam com cniSetElement*, em que * representa todos os nós com esse stem.Por exemplo:

      BIP4142 Avaliando cniSetElement [tipo de identificador de elemento]. Alterando um valor de [valor antes da alteração do usuário] para [valor após a alteração do usuário]"

    • BIP4144 e BIP4145: um par de mensagens que é rastreada por determinadas funções de implementação que, quando chamada por uma extensão definida pelo usuário, pode modificar o estado interno de um objeto do intermediário de mensagens. Os objetos possíveis do intermediário de mensagens incluem elemento, nó ou analisador de sintaxe. Essas mensagens relatam o parâmetro de entrada fornecido para o método chamado e o valor retornado. Por exemplo:

      BIP4144 Função digitada [function name] ([function call parameters])

      BIP4145 Saindo a função [function name] com o resultado: [result to be returned]

      Nessas mensagens, uma função de implementação pode ser interpretada como uma função de implementação C ou um método de implementação Java.

      As funções de implementação C que chamam mensagens BIP4144 e BIP4145 incluem:

      Para analisadores definidos pelo usuário Para nós definidos pelo usuário
      cpiCreateParserFactory cniCreateElement*
      cpiDefineParserClass cniDeleteMessage
      cpiAppendToBuffer cniAdd*
      cpiCreateElement cniDetach
      cpiCreateAndInitializeElement cniCopyElementTree
      cpiAddBefore cniFinalize
      cpiAddAfter cniWriteBuffer
      cpiAddAsFirstChild cniSql*
      cpiAddAsLastChild cniSetInputBuffer
      cpiSetNameFromBuffer cniDispatchThread

      (* representa todos os nós com essa base; por exemplo, cniAdd* inclui cniAddAfter, cniAddasFirstChild, cniAddasLastChild e cniAddBefore.)

      Os métodos Java que chamam as mensagens BIP4144 e BIP4145 são:

      Para nós definidos pelo usuário
      com.ibm.broker.plugin.MbElement.CreateElement*
      com.ibm.broker.plugin.MbElement.add*
      com.ibm.broker.plugin.MbElement.detach
      com.ibm.broker.plugin.MbElement.copyElementTree
    • BIP4146: uma mensagem de depuração rastreada durante a chamada de uma função de utilitário do analisador definido pelo usuário, onde a função de utilitário altera o estado de um elemento de sintaxe. Isto inclui todas as funções de utilitário que começam com cpiSetElement*, em que * representa todos os nós com esse stem. Por exemplo:

      BIP4146 Avaliando cpiSetElement [element identifier type]. Alterando o valor de [value before user's change] para [value after user's change]

      Para obter informações sobre a API C definida pelo usuário, consulte a API do Analisador Definido pelo Usuário de Linguagem C e a API do Nó Definido pelo Usuário de Linguagem C.

    • BIP4147: uma mensagem de erro que é rastreada, quando uma extensão definida pelo usuário transmite um objeto de entrada inválido para uma função da API do utilitário de extensão definido pelo usuário. Por exemplo:

      BIP4147 O parâmetro de entrada de extensão definido pelo usuário falhou ao depurar a verificação de validação. O parâmetro de entrada [nome do parâmetro] transmitido na função [nome da função] não é um objeto válido.

    • BIP4148: uma mensagem de erro que é rastreada, quando uma extensão definida pelo usuário danifica um objeto do intermediário. Por exemplo:

      BIP4148 A extensão definida pelo usuário danificou o objeto do intermediário. A função [nome da função] danificou o objeto do intermediário transmitido como parâmetro [nome do parâmetro].

    • BIP4149: uma mensagem de erro que é rastreada, quando uma extensão definida pelo usuário transmite um ponteiro de dados de entrada inválido para uma função API do utilitário de extensão definido pelo usuário. Por exemplo:

      BIP4149 O parâmetro de entrada de extensão definido pelo usuário falhou ao depurar a verificação de validação. O parâmetro de entrada [nome do parâmetro] transmitido na função [nome da função] não é um ponteiro NULL.

    • BIP4150: uma mensagem de erro rastreada quando uma extensão definida pelo usuário transmite dados de entrada inválidos para uma função de API do utilitário de extensão definido pelo usuário. Por exemplo:

      BIP4150 O parâmetro de entrada de extensão definido pelo usuário falhou ao depurar a verificação de validação. O parâmetro de entrada [nome do parâmetro] transmitido na função [nome da função] não possui um valor válido.

    • BIP4151: uma mensagem de depuração rastreada quando cniGetAttribute2 ou cniGetAttributeName2 configura o código de retorno para um valor inesperado. Os valores esperados são CCI_SUCCESS, CCI_ATTRIBUTE_UNKNOWN e CCI_BUFFER_TOO_SMALL. Qualquer outro valor é um valor inesperado. Por exemplo:

      BIP4151 Um valor inesperado foi retornado da função de implementação da extensão definida pelo usuário [function name].

    • BIP4152: uma mensagem de depuração rastreada quando cniGetAttribute2 ou cniGetAttributeName2 configura o código de retorno para CCI_BUFFER_TOO_SMALL e, em seguida, cniGetAttribute2 ou cniGetAttributeName2 é chamado novamente, desta vez com o tamanho de buffer correto, no entanto, o código de retorno ainda é configurado para CCI_BUFFER_TOO_SMALL. Por exemplo:

      BIP4152 Função de de implementação de extensão definida pelo usuário [function name] retornou CCI_BUFFER_TOO_SMALL na 2ª tentativa.

Você Deseja Depurar o Carregamento de Classe

  • Cenário: Você deseja depurar o carregamento de classe.
  • Solução: As classes e o local a partir do qual elas são carregadas são gravados no rastreio do usuário. Utilize estas informações para verificar se as classes corretas estão sendo carregadas.

Um Erro É Emitido quando Você Implementa uma Extensão Definida pelo Usuário no z/OS

  • Cenário:Ao implementar uma extensão definida pelo usuário no z/OS, Linux ou UNIX, um erro é exibido no registro de cada grupo de execução, informando que há autoridade insuficiente para abrir o arquivo LIL.
  • Explicação: No Linux e UNIX, a extensão definida pelo usuário deve ter permissão de leitura de grupo. No z/OS, a extensão definida pelo usuário deve ter permissão de execução de grupo.
  • Solução:
    • No Linux e UNIX, configure as permissões de arquivo da extensão definida pelo usuário para leitura de grupo, emitindo o comando chmod a+r.
    • No z/OS, configure as permissões de arquivo da extensão definida pelo usuário para leitura e execução do grupo, emitindo o comando chmod a+rx.

Você Não Pode Determinar quais Extensões Definidas pelo Usuário Foram Carregadas pelo Intermediário na Inicialização

  • Cenário: Você não pode determinar quais extensões definidas pelo usuário foram carregadas pelo intermediário na inicialização.
  • Solução: Utilize o comando do mqsireportproperties para cada tipo de extensão definida pelo usuário.
    • Para uma extensão definida pelo usuário Java, emita o comando:
      mqsireportproperties WBRK_BROKER -e default -o ComIbmJavaPluginNodeFactory -r

      Você verá um relatório semelhante a este exemplo:

      ComIbmJavaPluginNodeFactory
      	uuid='ComIbmJavaPluginNodeFactory'
      	userTraceLevel='none'
      	traceLevel='none'
      	userTraceFilter='none'
      	traceFilter='none'
      	NodeClassName='ComIbmJMSClientInputNode'
      	NodeClassName='ComIbmJMSClientOutputNode'
      	NodeClassName='ComIbmJavaComputeNode'
      	NodeClassName='ComIbmXslMqsiNode'
      	NodeClassName='SearchFilterNode'
      
      BIP8071I: Conclusão do comando bem-sucedido.

      A extensão definida pelo usuário chamada SearchFilter possui um NodeClassName de SearchFilterNode.

    • Para uma extensão definida pelo usuário C (presumindo que CONST_PLUGIN_NODE_FACTORY foi configurado como ComIbmSamplePluginNodeFactory no arquivo NodeFactory.h, como na amostra NumComputeNode), emita o comando:
      mqsireportproperties WBRK_BROKER -e default -o ComIbmSamplePluginNodeFactory -r

      Você verá um relatório semelhante a este exemplo:

      ComIbmSamplePluginNodeFactory
      	uuid='ComIbmSamplePluginNodeFactory'
      	userTraceLevel='none'
      	traceLevel='none'
      	userTraceFilter='none'
      	traceFilter='none'
      	NodeClassName='NumComputeNode'
      	
      BIP8071I: Conclusão do comando bem-sucedido.

      A extensão definida pelo usuário chamada NumCompute possui um NodeClassName de NumComputeNode.

Você Está Migrando um Nó C Definido pelo Usuário e cniDefineNodeClass Retorna CCI_INV_IMPL_FUNCTION.

  • Cenário: Quando você tenta migrar um nó C definido pelo usuário, cniDefineNodeClass retorna CCI_INV_IMPL_FUNCTION.
  • Explicação: Foram incluídos novos campos na estrutura CNI_VFT. CNI_VFT_DEFAULT foi atualizado para inicializar esses novos campos no arquivo de cabeçalho BipCci.h. se você inicializar CNI_VFT com CNI_VFT_DEFAULT, não deve ser necessária qualquer alteração de código. No entanto, se você não inicializar CNI_VFT com CNI_VFT_DEFAULT, esses novos campos são inicializados com valores aleatórios.
  • Solução: Inicialize seu CNI_VFT with CNI_VFT_DEFAULT.
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última atualização : 2009-02-13 16:13:19

au20120_