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

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

La présence de boucles sans fin dans le code JavaScript exécuté au sein d'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. Pour détecter des boucles sans fin, IBM BPM surveille le nombre d'instructions JavaScript exécutées dans chaque activité de script. Il définit un seuil d'instructions et un délai d'attente pour la durée de l'activité de script. Lorsque le seuil d'instructions est atteint, le moteur JavaScript invoque un rappel fourni par IBM BPM qui vérifie si la durée du script a dépassé le délai d'attente configuré. Si le délai est dépassé, IBM BPM génère une exception loop-detection-exception ou consigne un message d'erreur en fonction de la configuration. La valeur par défaut du seuil d'instructions est 25 millions d'instructions JavaScript.

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.

Les paramètres de détection des boucles sans fin suivants permettent de configurer le délai d'attente et le seuil d'instructions auquel IBM BPM fournit le rappel. Si la durée du script dépasse le délai d'attente, vous pouvez choisir d'arrêter le script.

  • loop-detection-duration : Si la valeur de délai 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).
  • loop-detection-exception : 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.
    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.
  • instruction-threshold : Lorsque le code JavaScript effectue des appels Java dans une boucle et qu'une grande partie de l'exécution est passée au sein du code Java, la détection d'une boucle sans fin peut prendre plus de temps que ne le requiert une procédure optimale. Le seuil par défaut de 25 millions d'instructions JavaScript peut nécessiter plus de temps que le délai d'expiration configuré et le script peut continuer à s'exécuter pendant longtemps. Par exemple, une boucle située dans le chemin du code d'un fichier JAR empêche le renvoi des données au moteur IBM BPM pour traitement et prolonge la durée d'une activité JavaScript. Vous pouvez utiliser la propriété instruction-threshold pour indiquer un nombre d'instructions JavaScript plus faible entre les invocations de la procédure de rappel pour une détection anticipée des boucles.

    IBM BPM multiplie la valeur configurée par 1000 avant de demander au moteur JavaScript d'invoquer le rappel pour la détection des boucles. La valeur par défaut est 250. Cela signifie que le moteur JavaScript invoque la procédure de rappel IBM BPM pour la détection des boucles toutes les 250000 instructions.

L'exemple suivant explique comment configurer les paramètres de détection des boucles JavaScript dans le fichier 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>