Detectando e finalizando loops infinitos nas atividades JavaScript

É possível ocorrer loops infinitos no código JavaScript executado dentro de aplicativos do IBM Business Process Manager. Você pode configurar parâmetros de detecção de loop JavaScript no arquivo 100Custom.xml para detectar loops infinitos e, opcionalmente, finalizá-los.

Quando ocorrem loops infinitos no código JavaScript em execução nos aplicativos IBM BPM, isso afeta outros recursos. Por exemplo, os encadeamentos do Process Center ou do Process Server são perdidos até que o servidor seja finalizado, afetando a disponibilidade do servidor. No entanto, pode ser difícil identificar qual atividade Javascript está em loop.

O IBM BPM monitora o número de instruções Javascript executadas em cada atividade de script. O tempo de execução de JavaScript notifica o mecanismo do IBM BPM quando o contador de instruções atinge o limite configurado pelo mecanismo do IBM BPM. Quando o limite do contador de instruções é atingido, o mecanismo do IBM BPM faz uma verificação para ver há quanto tempo a atividade de script está em execução.

Notas:
  • Chamadas para métodos Java ou chamadas API JavaScript do IBM BPM, como tw.system.executeServiceByName, são contadas como uma instrução.
  • Código JavaScript em arquivos gerenciados do lado do servidor que são referenciados por componentes do lado do servidor é contado como uma instrução individual, não apenas como uma instrução.
  • Atualmente há um limite de 25 milhões de instruções JavaScript codificadas permanentemente. A APAR JR51504 introduz a capacidade de alterar esse limite. Consulte JR51504: JAVASCRIPT LOOP DETECTION DOES NOT CATCH LOOPS THAT SPEND MOST OF THE TIME IN JAVA CODE.
Se o parâmetro loop-detection-exception estiver configurado como false, uma das mensagens a seguir será gravada no arquivo SystemOut.log:
  • CWLLG2261W: Suspeita de loop infinito depois de {0} segundos na atividade ''UKNOWN''. Se esse script não estiver em um loop, aumente a propriedade loop-detection-duration.
  • CWLLG2263W: Suspeita de loop infinito depois de {0} segundos em ''{1}'', para o BPD ''{2}'', atividade de script ''{3}''. Se esse script não estiver em um loop, aumente a propriedade loop-detection-duration.
  • CWLLG2265W: Suspeita de loop infinito depois de {0} segundos no serviço ''{1}''. Se esse serviço não estiver em um loop, aumente a propriedade loop-detection-duration
Se o parâmetro loop-detection-exception estiver configurado como true, uma das mensagens a seguir será gravada no arquivo SystemOut.log:
  • CWLLG2262E: Loop infinito detectado depois de {0} segundos, atividade ''UKNOWN'' finalizada. Se esse script não estiver em um loop, aumente a propriedade loop-detection-duration.
  • CWLLG2264E: Loop infinito detectado depois de {0} segundos em ''{1}'', para o BPD ''{2}'', atividade de script ''{3}'' finalizada. Se esse script não estiver em um loop, aumente a propriedade loop-detection-duration.
  • CWLLG2266E: Loop infinito detectado depois de {0} segundos, serviço ''{1}'' finalizado. Se esse serviço não estiver em um loop, aumente a propriedade loop-detection-duration.

Se o valor especificado pelo parâmetro loop-detection-duration for excedido, será assumido que a atividade está em um loop infinito. A duração padrão está configurada como 20 segundos, mas isso pode ser configurado (consulte o exemplo a seguir).

Por padrão, quando um loop infinito é detectado, o mecanismo do IBM BPM grava um aviso no arquivo SystemOut.log, mas a atividade de script continua. Para configurar o mecanismo do IBM BPM para finalizar as atividades de script de loop infinito, configure o parâmetro loop-detection-exception como true.

Configure os parâmetros de detecção de loop do JavaScript no arquivo 100Custom.xml como a seguir:
<common merge="mergeChildren">                                       
  <javascript-engine>                                                
    <loop-detection-duration>90</loop-detection-duration>            
    <loop-detection-exception>true</loop-detection-exception>        
  </javascript-engine>                                               
</common>