JavaScript アクティビティーでの無限ループの検出および終了
IBM® Business Process Manager アプリケーション内で実行される JavaScript および Java コードで無限ループが発生する可能性があります。無限ループを検出し、オプションでそれらの無限ループを終了させるように 100Custom.xml ファイル内のループ検出パラメーターを構成できます。
IBM BPM アプリケーション内で実行されている JavaScript コードで無限ループが発生している場合、他のリソースが影響を受けます。例えば、サーバーを停止しないと Process Center または Process Server のスレッドが失われるため、サーバーの可用性に影響します。無限ループを検出するために、IBM BPM は各スクリプト・アクティビティーで実行された JavaScript 命令の数をモニターします。スクリプト・アクティビティーの所要時間を検査するために、命令しきい値およびタイムアウトを設定します。命令しきい値に達すると、JavaScript エンジンは、IBM BPM が提供するコールバックを呼び出します。このコールバックは、スクリプトの所要時間が構成済みタイムアウトを超えているかどうかを検査します。タイムアウトを超えている場合、IBM BPM は、構成に応じて loop-detection-exception をスローするか、エラー・メッセージをログに記録します。2500 万回の JavaScript 命令が命令しきい値のデフォルト値として設定されています。
- Java メソッドの呼び出しまたは IBM BPM JavaScript API 呼び出し (tw.system.executeServiceByName など) は、1 つの命令としてカウントされます。
- サーバー・サイド・コンポーネントが参照している管理対象サーバー・サイド・ファイル内の JavaScript コードは、1 つのみの命令ではなく、個別の命令としてカウントされます。
以下のループ検出パラメーターを使用して、IBM BPM がコールバックを提供するタイムアウトと命令しきい値を構成できます。スクリプトの所要時間がタイムアウトを超えた場合、スクリプトの停止を選択できます。
- loop-detection-duration: loop-detection-duration パラメーターで指定されているタイムアウトを超えた場合、アクティビティーで無限ループが発生していると見なされます。デフォルトの期間は 20 秒に設定されていますが、構成可能です (以下の例を参照してください)。
- loop-detection-exception: デフォルトでは、無限ループが検出されると、IBM BPM エンジンが警告を SystemOut.log ファイルに書き込みますが、スクリプト・アクティビティーは続行します。無限ループが発生しているスクリプト・アクティビティーを停止するように IBM BPM エンジンを構成するには、loop-detection-exception パラメーターを true に設定します。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 プロパティーの値を大きくしてください。
- instruction-threshold: JavaScript コードによってループ内で Java 呼び出しが行われていて、実行時間のほとんどがこの Java コード内で費やされている場合、無限ループの検出は、設定した最適な時間より長くかかる場合があります。2500 万回の JavaScript 命令というデフォルトしきい値は、構成済みタイムアウト値より大幅に時間を要する可能性があり、スクリプトが長時間中断されない可能性があります。
例えば、JAR ファイルのコード・パス内のループが発生すると、処理のために IBM BPM エンジンに戻ることができなくなるため、JavaScript アクティビティーの所要時間が長引くことになります。instruction-threshold プロパティーを使用して、より早くループを検出するために次のコールバックを呼び出すまでの JavaScript 命令の数をより少なく指定できます。
IBM BPM は、構成済みの値を 1000 で乗算してから、JavaScript エンジンにループ検出コールバックを呼び出すよう指示します。デフォルト値は 250 です。つまり、JavaScript エンジンは、250000 回の JavaScript 命令ごとに IBM BPM ループ検出コールバックを呼び出すことになります。
<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>