- PR -

リクエストフォワードについて質問

投稿者投稿内容
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-04-26 13:23
サーブレットに対して同期の制御を行うのではなく、
サーブレットからシングルスレッドで実行される業務ロジックを
呼び出すようにすればいいと思います。

コード:
//サーブレット(SingleThreadModelは実装しない)
public class Hoge extends HttpServlet{

    doGet(省略){
        Logic.run(args);
    }
}

//業務ロジッククラス
public class Logic{

    public static synchronized void run(引数){
        業務ロジック
    }
}


クラスメソッドの場合、同期化を行うと、
同一のクラスローダでロードされたクラス単位で同期化が行われます。
Webアプリの場合は、同一のアプリケーションの中で同期が行われます。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-04-26 13:35
インスタンスプールを勘違いされていないでしょうか?

インスタンスプールが無効(通常時):
 コンテナによってサーブレットのインスタンスが1つ作成されて、
 リクエストに対しての処理を委譲する。
 直ぐに委譲できない場合、実行できるまで待つ。

インスタンスプールが有効(設定時):
 コンテナによってサーブレットのインスタンスが複数作成されて、
 リクエストに対しての処理を委譲する。
 直ぐに委譲できるインスタンスをプールから取得して委譲する。

と言うような感じです。

インスタンスプールでの振り分けは
実装によって条件が多少違うと思います。

ちなみにweb.xmlではコンテナに依存しますので、
そのような設定はありません。
Face
常連さん
会議室デビュー日: 2003/06/22
投稿数: 43
投稿日時: 2005-04-26 15:44
かつのりさん、ご返答有難うございます。
掲載していただいたサンプルコードを
是非利用さしていただこうと考え実験しました。

しかし、下記のようにロジック中で
長時間の処理を行った場合はsynchronized メソッド
により他の処理は待ち状態に入ってしまうようで、
ロックがかかったような
現象になってしまいどのように解決すれば
良いか困っております。

複数のリクエスト要求が互いに干渉しないよう、
かつ、シングルスレッドになるよう
とのイメージで二つ目のご返答にいただいた
「インスタンスプールが有効(設定時)」
のようにしたいのですが
1、プログラム中での設定
2、コンテナの設定
等お知りの部分があれば教えていただけないでしょうか。
よろしくお願いいたします。

コード: ----------------------------------------

//サーブレット(SingleThreadModelは実装しない)
public class Hoge extends HttpServlet{

doGet(省略){
Logic.run(args);
}
}

//業務ロジッククラス
public class Logic{

public static synchronized void run(引数){
(※ここで10分かかると想定)
}
}

--------------------------------------------------

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-04-26 16:03
私もFaceさんの質問の意図があまりよくわかっていませんでした。

要はマルチスレッドでの動作で一貫性が取れればいいということですか?
(フィールドの状態などが別スレッドによって書き換えられない等・・・)

ならばスレッド単位でインスタンスを生成すれば、問題にならないと思います。
その場合、業務ロジックをサーブレッドに実装するのではなく、
業務ロジッククラスのインスタンスをサーブレットで作成するようにして下さい。

コード:
//サーブレット(SingleThreadModelは実装しない)
public class Hoge extends HttpServlet{

    doGet(省略){
        //インスタンスを生成して実行
        Logic l = new Logic();
        l.run(args);
    }
}

//業務ロジッククラス
public class Logic{

    private xxx xxx;//フィールド

    public void run(引数){
        業務ロジック
    }
}



インスタンスプールについてはコンテナの実装次第だと思います。
コンテナの実装に依存するような作り方は
互換性の問題もありますので、お勧めしません。

また、設定方法等について質問する場合は、
使用しているコンテナ等の環境について、詳しく書いた方が、
色んな方からの回答が得られやすいかなと思います。
(私はサーブレットコンテナのインスタンスプールについてはよく知りませんが。)
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-04-27 12:01
staticメソッドを同期させた場合、インスタンスではなくクラスにロックがかかってしまう
ため、いくらインスタンスプールを使ってもロック待ちになります。そのメソッドはstatic
でなければいけないものでしょうか。でなければ、インスタンスメソッドにしてはどうでしょうか。

スキルアップ/キャリアアップ(JOB@IT)