質問
スクリプトの実行が一定時間を超えた場合に実行を中断させたいのですが、実装可能でしょうか。
回答
スクリプトの実行タイムアウトは、[スレッド] 処理と [条件分岐] 処理、および [待機] 処理を用いて実装することが可能です。
基本構成
[スレッド] 処理によってメインで行う処理とタイムアウト判定を行う処理を並列で実行させ、メイン処理が一定時間を超えた場合は [例外通知] 処理を用いてスクリプトを中断させる
スクリプト構成イメージ
処理の流れ
- [スレッド] 処理によって、メイン処理と実行タイムアウト処理を並列で実行します。
- メイン処理では、[CSVファイル読み取り] 処理でファイルを読み取り、読み取り終了後、スクリプト変数「終了フラグ」に「true」を設定します。
- 実行タイムアウト処理では [繰り返し処理] で指定回数分、以下の処理を繰り返します*。
- [待機] 処理で一定時間待機します。
- [条件分岐] 処理でメイン処理の実行状況を判定し、終了している場合は [繰り返し] 処理を抜け出します。
- [繰り返し] 処理終了後、「[条件分岐] 処理(1)でメイン処理の実行状況を判定し、終了していない場合、[例外通知] 処理でスクリプトを異常終了させます。
*例えば1分間の実行タイムアウトを設定する場合、12秒の待機処理を5回繰り返すことで実現可能です。
構築手順
- 実行タイムアウト設定として使用するスクリプト変数を作成します。
・「ループ回数」(数値型):待機を繰り返す回数を指定
・「終了フラグ」(真偽値型):初期値は「false」 - デザイナのツールパレット「基本」-「フロー」-「スレッド」から、スレッド処理をスクリプトキャンバスに配置します。
- デザイナのツールパレット「ファイル」-「CSV」-「CSVファイル読み取り」から、CSVファイル読み取り処理をスクリプトキャンバスに配置します。
※必要に応じてメインで実行したい処理を配置してください - デザイナのツールパレット「基本」-「処理」-「変数代入」から、変数代入処理をスクリプトキャンバスに配置します。
- 変数代入処理のMapperエディタを開き、スクリプト変数「終了フラグ」に「true」を代入します。
値の代入には、Mapperロジックの「条件」-「真偽」より「真偽値定数」を使用します。 - デザイナのツールパレット「基本」-「フロー」-「繰り返し」から、繰り返し処理をスクリプトキャンバスに配置します。
設定の「繰り返し回数」にはスクリプト変数「ループ回数」を指定します。 - デザイナのツールパレット「基本」-「フロー」-「条件分岐」から、条件分岐処理をスクリプトキャンバスに配置します。
条件にてスクリプト変数「終了フラグ」が「true」と等しいかを比較します。 - デザイナのツールパレット「基本」-「フロー」-「break」から、break処理をスクリプトキャンバスに配置します。
-
デザイナのツールパレット「基本」-「処理」-「待機」から、待機処理をスクリプトキャンバスに配置します。
必須設定に一回あたりの待機時間を指定します。 - デザイナのツールパレット「基本」-「フロー」-「条件分岐」から、2つめの条件分岐処理をスクリプトキャンバスに配置します。
条件にはスクリプト変数「終了フラグ」が「true」と等しくないかを比較します。 - デザイナのツールパレット「基本」-「処理」-「例外通知」から、例外通知処理をスクリプトキャンバスに配置します。
設定の「メッセージ」には、タイムアウト時に表示させたいエラーメッセージを入力します。 - スクリプトを実行し、以下の結果になれば成功です。
・メイン処理が設定時間以内に終了した場合、正常終了します
・メイン処理が設定時間以内に終了しない場合、例外通知が発生し異常終了します
応用例
応用例1:時刻によるタイムアウト判定

- 現在日時とタイムアウトのしきい値となる時刻を格納するスクリプト変数をそれぞれ用意
- スクリプト開始直後にタイムアウト時刻を代入
(例:現在から1時間後) - タイムアウト判定処理部にて、一定間隔で現在時刻とタイムアウト時刻を比較し、超過している場合は例外通知処理を実行する。
メイン処理の完了フラグが立っていない場合は再度判定を繰り返す
応用例2:タイムアウトした場合に後続処理を行う

- タイムアウトを実装したスクリプトを呼び出す親スクリプトを別作成
- 例外監視処理で、呼び出したスクリプトがタイムアウト(例外通知)した場合は後続処理を行うよう分岐
そのほか、具体的な構成のお悩みにつきましては、テクニカルサポートへお問い合わせください。
コメント
0件のコメント
記事コメントは受け付けていません。