Detección y finalización de bucles infinitos en actividades JavaScript

Los bucles infinitos se pueden producir en el código JavaScript y Java que se ejecuta en aplicaciones IBM® Business Process Manager. Puede configurar parámetros de detección de bucles en el archivo 100Custom.xml para detectar bucles infinitos y, opcionalmente, finalizarlos.

Cuando se producen bucles infinitos en código JavaScript que se ejecuta en aplicaciones IBM BPM, esto afecta a otros recursos. Por ejemplo, las hebras de Process Center o Process Server se pierden hasta que se detiene el servidor, lo que afecta a la disponibilidad del servidor. Para detectar bucles infinitos, IBM BPM supervisa el número de instrucciones de JavaScript ejecutadas en cada actividad de script. Se establece un umbral de instrucciones y un tiempo de espera para comprobar la duración de la actividad de script. Cuando se alcanza el umbral de instrucciones, el motor de JavaScript invoca una devolución de llamada proporcionada por IBM BPM que comprueba si la duración del script ha excedido el tiempo de espera configurado. Si se ha excedido el tiempo de espera, IBM BPM lanza una loop-detection-exception o anota un mensaje de error, en función de la configuración. El valor predeterminado del umbral de instrucciones es de 25 millones de instrucciones JavaScript.

Notas:
  • Las llamadas a métodos Java o a la API JavaScript de IBM BPM, como por ejemplo tw.system.executeServiceByName, se contabilizan como una instrucción.
  • El código JavaScript dentro de archivos del lado del servidor gestionado a los que hacen referencia los componentes del lado del servidor se contabiliza como instrucciones individuales, no como una sola instrucción.

Utilizando los siguientes parámetros de detección de bucles, puede configurar el tiempo de espera y el umbral de instrucciones al llegar al cual IBM BPM proporciona la devolución de llamada. Si la duración del script excede el tiempo de espera, puede optar por detener el script.

  • loop-detection-duration: Si se supera el valor de tiempo de espera especificado por el parámetro loop-detection-duration, se presupone que la actividad está en un bucle infinito. La duración predeterminada está establecida en 20 segundos, pero es configurable (consulte el ejemplo siguiente).
  • loop-detection-exception: De forma predeterminada, cuando se detecta un bucle infinito, el motor de IBM BPM escribe un aviso en el archivo SystemOut.log, pero la actividad del script continúa. Para configurar el motor de IBM BPM para que detenga las actividades de script en bucle infinito, establezca el parámetro loop-detection-duration en true.
    Si el parámetro loop-detection-exception se establece en false, se graba uno de los mensajes siguientes en el archivo SystemOut.log:
    • CWLLG2261W: Sospecha de bucle infinito después de {0} segundos en la actividad ''UKNOWN''. Si este script no está en un bucle, aumente la propiedad loop-detection-duration.
    • CWLLG2263W: Sospecha de bucle infinito después de {0} segundos en ''{1}'', para la BPD ''{2}'', actividad de script ''{3}''. Si este script no está en un bucle, aumente la propiedad loop-detection-duration.
    • CWLLG2265W: Sospecha de bucle infinito después de {0} segundos en el servicio ''{1}''. Si este servicio no está en un bucle, aumente la propiedad loop-detection-duration
    Si el parámetro loop-detection-exception se establece en true, se graba uno de los mensajes siguientes en el archivo SystemOut.log:
    • CWLLG2262E: Bucle infinito detectado después de {0} segundos, actividad ''UKNOWN'' terminada. Si este script no está en un bucle, aumente la propiedad loop-detection-duration.
    • CWLLG2264E: Bucle infinito detectado después de {0} segundos en ''{1}'', para la BPD ''{2}'', actividad de script ''{3}'' terminada. Si este script no está en un bucle, aumente la propiedad loop-detection-duration.
    • CWLLG2266E: Bucle infinito detectado después de {0} segundos, servicio ''{1}'' terminado. Si este servicio no está en un bucle, aumente la propiedad loop-detection-duration.
  • instruction-threshold: Cuando el código JavaScript hace llamadas Java en un bucle y la mayor parte del tiempo de ejecución se emplea dentro del código Java, detectar un bucle infinito puede tardar más de lo recomendable. El umbral predeterminado de 25 millones de instrucciones JavaScript podría tardar mucho más tiempo que el tiempo de espera configurado, y el script podría permanecer sin interrupciones durante un largo periodo de tiempo. Por ejemplo, un bucle en la vía de acceso de código de un archivo JAR impide que se devuelve al motor de IBM BPM para el proceso, lo cual prolonga la duración de la actividad de JavaScript. Utilizando la propiedad instruction-threshold, puede especificar un número inferior de instrucciones JavaScript entre las llamadas a la devolución de llamada para que el bucle se detecte antes.

    IBM BPM multiplica por 1000 el valor configurado antes de que indica al motor de JavaScript que llame a la devolución de llamada de detección de bucle. El valor predeterminado es 250. Esto significa que el motor de JavaScript llama a la devolución de llamada de detección de bucle de IBM BPM cada 250000 instrucciones JavaScript.

El ejemplo siguiente ilustra cómo configurar los parámetros de detección de bucles JavaScript en el archivo 100Custom.xml:
<common merge="mergeChildren">                                       
  <javascript-engine>                                                
    <loop-detection-duration merge="replace">90</loop-detection-duration>            
    <loop-detection-exception merge="replace">true</loop-detection-exception>
    <instruction-threshold merge="replace">250</instruction-threshold>        
  </javascript-engine>                                               
</common>