JavaScript アクティビティーでの無限ループの検出および強制終了

IBM Business Process Manager アプリケーション内で実行されている JavaScript コードで無限ループが発生する可能性があります。100Custom.xml ファイル内の JavaScript ループ検出パラメーターを構成して、無限ループを検出し、オプションとして無限ループを強制終了することができます。

IBM BPM アプリケーション内で実行されている JavaScript コードで無限ループが発生している場合、他のリソースが影響を受けます。例えば、サーバーを強制終了するまで Process Center または Process Server のスレッドが失われるため、サーバーの可用性に影響します。しかし、ループが発生している JavaScript アクティビティーを識別するのが難しい場合があります。

IBM BPM は、各スクリプト・アクティビティーで実行された JavaScript 命令の数をモニターします。JavaScript ランタイムは、IBM BPM エンジンによって設定された制限に命令カウンターが達すると、IBM BPM エンジンに通知します。命令カウンターしきい値に達すると、IBM BPM エンジンは、スクリプト・アクティビティーが実行されている期間をチェックします。

ノート (Notes):
  • Java メソッドの呼び出しまたは IBM BPM JavaScript API 呼び出し (tw.system.executeServiceByName など) は、1 つの命令としてカウントされます。
  • サーバー・サイド・コンポーネントが参照している管理対象サーバー・サイド・ファイル内の JavaScript コードは、1 つのみの命令ではなく、個別の命令としてカウントされます。
  • 現在、JavaScript 命令の制限として 2500 万という数がハードコーディングされています。APAR JR51504 では、この制限を変更する機能を導入しています。『JR51504: JAVASCRIPT LOOP DETECTION DOES NOT CATCH LOOPS THAT SPEND MOST OF THE TIME IN JAVA CODE』を参照してください。
loop-detection-exception パラメーターが false に設定された場合、以下のメッセージのいずれかが SystemOut.log ファイルに書き込まれます。
  • CWLLG2261W: 不明なアクティビティーで {0} 秒経過後に無限ループが発生した可能性があります。このスクリプトがループしていない場合は、loop-detection-duration プロパティーの値を大きくしてください。
  • CWLLG2263W: BPD ''{2}'' とスクリプト・アクティビティー ''{3}'' について ''{1}'' で {0} 秒経過後に無限ループが発生した可能性があります。このスクリプトがループしていない場合は、loop-detection-duration プロパティーの値を大きくしてください。
  • CWLLG2265W: サービス''{1}'' で {0} 秒経過後に無限ループが発生した可能性があります。このサービスがループしていない場合は、loop-detection-duration プロパティーの値を大きくしてください
loop-detection-exception パラメーターが true に設定された場合、以下のメッセージのいずれかが SystemOut.log ファイルに書き込まれます。
  • CWLLG2262E: 不明なアクティビティーで {0} 秒経過後に無限ループが検出されました。このアクティビティーは強制終了されます。このスクリプトがループしていない場合は、loop-detection-duration プロパティーの値を大きくしてください。
  • CWLLG2264E: BPD ''{2}'' とスクリプト・アクティビティー ''{3}'' について ''{1}'' で {0} 秒経過後に無限ループが検出されました。このアクティビティーは強制終了されます。このスクリプトがループしていない場合は、loop-detection-duration プロパティーの値を大きくしてください。
  • CWLLG2266E: サービス ''{1}'' で {0} 秒経過後に無限ループが検出されました。このサービスは強制終了されます。このサービスがループしていない場合は、loop-detection-duration プロパティーの値を大きくしてください。

loop-detection-duration パラメーターによって指定された値を超過している場合、アクティビティーで無限ループが発生していると見なされます。デフォルトの期間は 20 秒に設定されていますが、構成可能です (以下の例を参照してください)。

デフォルトでは、無限ループが検出されると、IBM BPM エンジンが警告を SystemOut.log ファイルに書き込みますが、スクリプト・アクティビティーは続行します。無限ループが発生しているスクリプト・アクティビティーを強制終了するように IBM BPM エンジンを構成するには、loop-detection-exception パラメーターを true に設定します。

100Custom.xml ファイル内の JavaScript ループ検出パラメーターを以下のように構成します。
<common merge="mergeChildren">                                       
  <javascript-engine>                                                
    <loop-detection-duration>90</loop-detection-duration>            
    <loop-detection-exception>true</loop-detection-exception>        
  </javascript-engine>                                               
</common>