エラーについて

Paraselene では、以下のケースでブラウザにエラーを返します。

ステータスコード 事象
403 Forbidden 指定URLが解決できない場合。
※404を返す場合は、アプリケーションのデプロイに失敗しており、
Paraseleneではなくサーブレットコンテナが返しています。
500 Internal Server Error 処理中に例外が発生した場合。
この時の例外は、
  • 標準出力へスタックトレースを出力。
  • Gate.onErrorへ通知。
されます。
また、セッションが切断されます。
503 Service Unavailable Gate.getRequestMaxCountを越えるリクエストが発生した場合。
リクエスト発生時に使用可能メモリの93.75%を使っていた場合。

タイムアウトの検出

Page 派生クラスの各 input(inputMain)、output(outputMain) はタイムアウト(デフォルト3分。補足として、IE のデフォルトタイムアウトは5分のようです)が過ぎてもリターンしなかった場合、強制停止され、KilledByTimeoutException がスローされます。
※ SandBox.setTimeoutMinute にてタイムアウトは変更可能です。
以下はデッドロックを起こすプログラム(synchronized 対象が入れ子になっているためデッドロックします)にて、タイムアウトが発生した場合のスタックトレースです。
2枚のブラウザで、一方で IndexHtml.java へアクセス、もう一方で NextHtml.java へアクセスしています。

IndexHtml.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;
    }
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( 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)を使用しています。それに起因する問題が書かれています。

最終更新: 2009/10/26
特に明示されていない限り、本Wikiの内容は次のライセンスに従います:CC Attribution 3.0 Unported
文書の先頭へ
SourceForge.JP
2009 © Akira Terasaki.  
Driven by DokuWiki The Apache Software Foundation