はじめに
プリザンターの便利な機能であるサーバスクリプト、処理ごとにタイムアウトの設定が可能ですが、実際の設定値と挙動を見比べたときに直感と反する挙動をすることがあります。今回はこのタイムアウト部分がどのような実装になっているのかコード面から深掘りしてみます。
サーバスクリプトのタイムアウトとは?
サーバスクリプトはプリザンターに組み込まれているClearScriptの実行エンジンによって実行されます。この実行エンジンはプリザンターの本体とはプロセスが切り離されています。この別で実行されるプロセスの処理の完了待ちをおこなっていますが、これをいつまで待つかを設定しているのがサーバスクリプトのタイムアウトになります。
タイムアウトの2つの設定
サーバスクリプトの処理ごとにミリ秒でタイムアウトが設定出来るようになっています。全てのサーバスクリプト共通で設定されるパラメータのScript.jsonのServerScriptTimeOutで設定されるものと、パラメータのScript.jsonのServerScriptTimeOutChangeableをtrueにすることでサーバスクリプト個別で設定されるものの2パターンが存在します。
いずれも一括設定なのか、個別設定が追加で出来るかというだけの違いなので、使う上にはあまり気にしなくても大丈夫です。
実装を見てみる
実際にサーバスクリプトを実行している部分の実装を見てみます。下記のメソッドが実行部分になります。
処理をさらーっと流すと
- パラメータでサーバスクリプトが無効化されていない
- 個別のサーバスクリプトが無効化されていない
- サーバスクリプトが入れ子実行されたときに実行深さが10段未満であること
の3条件を満たしたときに実行されるようになっています。そしてタイムアウトを設定しているのは下記の部分になります。
GetTimeOutメソッドが呼ばれているので、GetTimeOutを見てみます。
同一の実行条件のサーバスクリプトのタイムアウトの値は全てまとめられて、その中の最大値が適用されるような実装になっています。
実際にサーバスクリプトが実装される部分を見てみましょう。
同一条件のものは文字列で結合されて、1つにまとめられてしまっています。
サーバスクリプトでAとBという2つのものがあったとして、それぞれの処理のタイムアウトの設定値を20,000ミリ秒と30,000ミリ秒とします。画面などの雰囲気では、Aで20,000ミリ秒、Bで30,000ミリ秒とそれぞれ独立したタイムアウトの値が設定されるように見えますが、実際の実装では、AとBは結合され、それぞれの最大値である30,000ミリ秒のタイムアウトがセットされて実行されます。
タイムチャートにするとこんな感じになります。
画面の実装と反する部分があって直感的ではないですね。更新後や作成後などに長めのタイムアウトが必要な処理を仕込むことはあるかと思いますので、これは要注意ですね。
まとめ
今回はサーバスクリプトのタイムアウトについて詳しくて見てみました。画面上だとサーバスクリプトごとにタイムアウトの値が設定出来るパターンもありますが、実際にはそれらは個別に使われずに最大値が使われるだけという、画面の実装と反する部分があることが分かりました。要注意ポイントになるかと思いますので、タイムアウトを変更する必要がある場合は気をつけてみてください。