Paraselene では、以下のケースでブラウザにエラーを返します。
| ステータスコード | 事象 | |
|---|---|---|
| 403 | Forbidden | 指定URLが解決できない場合。 ※404を返す場合は、アプリケーションのデプロイに失敗しており、 Paraseleneではなくサーブレットコンテナが返しています。 |
| 500 | Internal Server Error | 処理中に例外が発生した場合。 この時の例外は、
また、セッションが切断されます。 |
| 503 | Service Unavailable | Gate.getRequestMaxCountを越えるリクエストが発生した場合。 リクエスト発生時に使用可能メモリの93.75%を使っていた場合。 |
Page 派生クラスの各 input(inputMain)、output(outputMain) はタイムアウト(デフォルト3分。補足として、IE のデフォルトタイムアウトは5分のようです)が過ぎてもリターンしなかった場合、強制停止され、KilledByTimeoutException がスローされます。
※ SandBox.setTimeoutMinute にてタイムアウトは変更可能です。
以下はデッドロックを起こすプログラム(synchronized 対象が入れ子になっているためデッドロックします)にて、タイムアウトが発生した場合のスタックトレースです。
2枚のブラウザで、一方で IndexHtml.java へアクセス、もう一方で NextHtml.java へアクセスしています。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
public Page outputMain(Page from, RequestParameter req) throws PageException { // 出力内容を設定します。 // 初期化したい場合は、init()をコールして下さい。 try { synchronized( NextHtml.object ) { Thread.sleep( 1000 * 10 ); synchronized( IndexHtml.object ) { } } } catch( Exception e ) {} return this; }
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
public Page outputMain(Page from, RequestParameter req) throws PageException { // 出力内容を設定します。 // 初期化したい場合は、init()をコールして下さい。 try{ synchronized( IndexHtml.object ) { Thread.sleep( 1000 * 10 ); synchronized( NextHtml.object ) { } } } catch( Exception e ) {} return this; }
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
paraselene.supervisor.KilledByTimeoutException =====[job 0]=========================== timeout.logic.NextHtml.outputMain(NextHtml.java:79) timeout.SuperPage.output(SuperPage.java:126) paraselene.supervisor.Child.run(SandBox.java:31) ===== at timeout.logic.IndexHtml.outputMain(IndexHtml.java:79) at timeout.SuperPage.output(SuperPage.java:126) at paraselene.supervisor.Child.run(SandBox.java:31)
この場合も例外発生の1種として、500を返します。
スタックトレースから各処理がどこを処理中であったか追跡できますので、デッドロックが原因である場合は、この情報から改善を図って下さい。
また、KilledByTimeoutException の API リファレンスの説明にも目を通しておいて下さい。強制停止には Java の非推奨メソッド(java.lang.Thread#stop)を使用しています。それに起因する問題が書かれています。