Détection et arrêt des boucles sans fin dans les activités JavaScript

Des boucles sans fin peuvent se produire dans le code JavaScript qui s'exécute au sein des applications IBM Business Process Manager. Vous pouvez configurer des paramètres de détection de boucle JavaScript dans le fichier 100Custom.xml pour détecter les boucles sans fin et éventuellement les interrompre.

L'apparition de boucles sans fin dans le code JavaScript qui s'exécute au sein des applications IBM BPM a une incidence sur les autres ressources. Par exemple, les unités d'exécution de Process Center ou Process Server sont perdues jusqu'à l'arrêt du serveur et cela a une incidence sur la disponibilité du serveur. Toutefois, il peut être difficile d'identifier l'activité JavaScript qui fonctionne en boucle.

IBM BPM surveille le nombre d'instructions JavaScript exécutées dans chaque activité de script. L'exécution JavaScript notifie le moteur IBM BPM lorsque le compteur d'instructions atteint la limite que le moteur a définie. Lorsque le seuil du compteur d'instructions est atteint, le moteur IBM BPM vérifie depuis combien de temps l'activité de script s'exécute.

Remarques :
  • Les appels de méthodes Java ou d'API JavaScript IBM BPM comme tw.system.executeServiceByName comptent pour une instruction.
  • Le code JavaScript intégré aux fichiers gérés côté serveur qui sont référencés par des composants côté serveur comptent pour plusieurs instructions spécifiques, pas pour une seule instruction.
  • Il existe actuellement une limite de 25 millions d'instructions JavaScript codées en dur. Le correctif APAR JR51504 permet de modifier cette limite. Pour plus d'informations, voir JR51504: JAVASCRIPT LOOP DETECTION DOES NOT CATCH LOOPS THAT SPEND MOST OF THE TIME IN JAVA CODE.
Si le paramètre loop-detection-exception a pour valeur false, l'un des messages suivants est consigné dans le fichier SystemOut.log :
  • CWLLG2261W: Infinite loop suspected after {0} seconds in ''UKNOWN'' activity. If this script is not in a loop, increase the loop-detection-duration property.
  • CWLLG2263W: Infinite loop suspected after {0} seconds in ''{1}'', for BPD ''{2}'', script activity ''{3}''. If this script is not in a loop, increase the loop-detection-duration property.
  • CWLLG2265W: Infinite loop suspected after {0} seconds in service ''{1}''. If this service is not in a loop, increase the loop-detection-duration property
Si le paramètre loop-detection-exception a pour valeur true, l'un des messages suivants est consigné dans le fichier SystemOut.log :
  • CWLLG2262E: Infinite loop detected after {0} seconds, ''UKNOWN'' activity terminated. If this script is not in a loop, increase the loop-detection-duration property.
  • CWLLG2264E: Infinite loop detected after {0} seconds in ''{1}'', for BPD ''{2}'', script activity ''{3}'' terminated. If this script is not in a loop, increase the loop-detection-duration property.
  • CWLLG2266E: Infinite loop detected after {0} seconds, service ''{1}'' terminated. If this service is not in a loop, increase the loop-detection-duration property.

Si la valeur indiquée par le paramètre loop-detection-duration est dépassée, on suppose que l'activité se trouve dans une boucle sans fin. La durée par défaut correspond à 20 secondes mais vous pouvez configurer votre propre valeur (voir l'exemple ci-dessous).

Par défaut, lorsqu'une boucle sans fin est détectée, le moteur IBM BPM consigne un avertissement dans le fichier SystemOut.log mais l'activité de script continue. Si vous souhaitez configurer le moteur IBM BPM pour arrêter les activités de scripts qui s'exécutent dans une boucle sans fin, associez le paramètre loop-detection-exception à la valeur true.

Configurez les paramètres de détection de boucle JavaScript dans le fichier 100Custom.xml comme suit :
<common merge="mergeChildren">                                       
  <javascript-engine>                                                
    <loop-detection-duration>90</loop-detection-duration>            
    <loop-detection-exception>true</loop-detection-exception>        
  </javascript-engine>                                               
</common>