通常、一つのServletに対して、同一のsession idで(一つのクライアントで)複数並列処理します。

しかし、それじゃ都合が悪いので、一つのServletに対してはsession id毎に一つのスレッドしか発生しないようにしたいと思っています。ただ、あるスレッドが処理している最中にリクエストを受け付けたら、既に動いているスレッドを強制終了させて、後のリクエストのみを処理させたいと思っています。

が、なかなかいい案が思い浮かばず苦悩しています。

要求条件を整理すると次のようになります。
・一つのServletに対して、一つのsession idで一つのスレッドだけしか処理しないようにしたい。
・最後に受け付けたリクエストを活かし、処理中のスレッドは終了させたい。

二つ目の条件を満たすためには、一時的に二つのスレッドが発生することになると思っています。

皆様のお知恵をおかしください。

A 回答 (1件)

ThreadGroup(スレッドグループ)を使うのはどうでしょうか?


詳細は、ThreadGroupクラスのリファレンスを見てください。


スレッドグループを取得し、現在のアクティブなスレッドを取得もしくは
破棄し、カレントのリクエストをいかす。というような処理をすれば、
この2点は実現できそうな気がします。

ちなみに、

現在のスレッドからスレッドグループを取得する方法は、

ThreadGroup grp = Thread.currentThread().getThreadGroup()で行えます。

あとは、スレッドグループからアクティブなスレッド数や
スレッドの参照取得、等いろいろ制御ができるので、
これを応用してこの2点を実現できそうな気がしますが。

アドバイスになりましたでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFreeBSD Apacheの環境でサーブレットやJSPは使用できますか?

 Javaについての質問ですが
FreeBSD Apacheの環境でサーブレットやJSPは使用できますか?
FreeBSD Apacheの環境でのサーブレットやJSPの実装は存在しますか、という質問です。
Javaに詳しい方、どうかよろしくお願いいたします。

Aベストアンサー

FreeBSD上でサーブレットやJSPを動かすためには、
・Tomcatなどのアプリケーションサーバ(Javaサーバ)
・JVM(Java実行環境)
が必要です。

TomcatはJavaで書かれているためプラットフォーム非依存なので○○版、というのはありません。
(配布ファイルの圧縮形式でZip版とtar.gz版とWindows向けインストーラつきのexe版がありますが、中身のTomcat本体はどれも同じのはずです。)

次にFreeBSD用のJava実行環境ですが、次のところから入手できるようです。しかしSunのJVM仕様とどのくらい互換性があるのかわかりませんので、Tomcatが正しく動作するかというと、私にはわかりません。

参考URL:http://www.freebsd.org/ja/java/

Qリクエスト処理スレッド

アプリケーションサーバーで
Webアプリを動かし、
リクエスト処理スレッドが復帰しない場合、
つまり数分間ビジーな場合、エラーが出ることを確認しなければならなくなりました。

単にビジーになればいいのかと、
whileで終了しないループを作ってみたのですが、
それではリクエスト処理スレッドにはならなく、タイムアウトにはなったものの、目的のエラーが出てくれませんでした。

リクエスト処理スレッドがビジーとなるようなプログラムをどう組めばいいか教えてください。

ヒントだけでも助かります

Aベストアンサー

java.lang.Thread#sleepで
タイムアウトになるまで
スレッドを寝かせておく…
ってのはダメですか?

QApache環境でJavaサーブレットを動かすのには?

Windows2000のマシンに「Apache for Win32(Ver1.3)」と「JDK1.3」をインストールし、
そのサーバで実際にJavaサーブレットで作成したページを表示させようとしました。
しかし、サーブレットのソース(****.java)を「javac」でコンパイルしたところ、
エラーが発生して、うまく動作されませんでした。
雑誌にあったサンプルをコンパイルしたので文法的には当たっているので、
問題は環境にあるように思えるのですが、他にインストールするものはあるのでしょうか?

Aベストアンサー

サーブレットのコンパイルには、JDKとは別に、JSDKが必要です。
また、サーブレットを実行するのも、確か、Apacheだけでは無理です。
(昔は無理でした)
で、JRun、Apache JServ等のサーブレットエンジンと呼ばれるものを
インストールする必要があります。
(Tomcatを入れるのがいいのかな?)

QServletとマルチスレッド

以下のようにServlet側のある部分をマルチスレッドで実装しましたが、まったく速くなりません。Servletはもともとマルチスレッドで動いてるから速くならないのか、それとも自分のソースがおかしいのかわかりません、どなたかおしえていただけますか?

public class ***Servlet exends ** {

private void hogehoge(){
HogeThread hoge1 = new HogeThread();
Thread th1 = new Thread(hoge, "");
th1.start();

HogeThread hoge2 = new HogeThread();
Thread th2 = new Thread(hoge, "");
th2.start();
}
}
class HogeThread implements Runnable {
public void run() {
// hogehoge
}
}

以下のようにServlet側のある部分をマルチスレッドで実装しましたが、まったく速くなりません。Servletはもともとマルチスレッドで動いてるから速くならないのか、それとも自分のソースがおかしいのかわかりません、どなたかおしえていただけますか?

public class ***Servlet exends ** {

private void hogehoge(){
HogeThread hoge1 = new HogeThread();
Thread th1 = new Thread(hoge, "");
th1.start();

HogeThread hoge2 = new HogeThread();
...続きを読む

Aベストアンサー

> 理論上処理速度は2倍になる
スレッドが2つ(対象URLが2つ)なら、各処理速度は1/2になります。小学校の算数です。ただし、マルチスレッドを使うと、2つめ以降のI/Oの、自分の番の開始をえんえん待たされる苦痛は軽減します。高級なマシンでは、ローカルなディスクI/Oでもマルチスレッドを使いますし、それがn個のマルチコアを有効に使っていれば、まさしく、全体の速度はほぼn倍になります。

Qサーブレットforward時の実行メソッドについて

初歩的な質問で失礼します。

サーブレットAに doGet, doPost, serviceメソッドを実装しています。
サーブレットBのdoPostメソッド内にて
サーブレットAにforwardを実行する場合に、
呼出されるのはサーブレットAのどのメソッドですか?

JSPへのforwardはできたのですが、
サーブレットへのforwardができず悩んでいます。

サーブレットのAPIを読んでもいまいちわかりません。
何かメソッドに関する制約があるのでしょうか?
上の質問は全くマト外れでしょうか?

追加ですが・・・
サーブレットからforwardされたサーブレットで、
そこからさらにJSPへforwardすることはできますか?

Apache2.0.43+tomcat4.1.12+Java1.4.0_01です。

Aベストアンサー

> サーブレットBのdoPostメソッド内にて
> サーブレットAにforwardを実行する場合に、
> 呼出されるのはサーブレットAのどのメソッドですか?

doPost() のはず。実際には、forward するときの HttpServletRequest#getMethod() で取得できる文字列に従うはず。

> JSPへのforwardはできたのですが、
> サーブレットへのforwardができず悩んでいます。

forward に関して、servlet と JSP の違いはないはず(というか、JSP は自動コンパイルされる servlet だし)。
getRequestDispatcher() してるパスが間違っているのだと思います。

> サーブレットからforwardされたサーブレットで、
> そこからさらにJSPへforwardすることはできますか?

コンテナの実装次第だけど、forward() は、サブルーチン呼び出しと変わらないはずなので、
回数に制限はないはず。

QServletにおけるスレッド間でのグローバル変数の関係

お世話になっております。

サーブレットクラスにて定義したグローバル変数へ、それぞれ別のスレッドからアクセスした場合、
それぞれの値には関連性が無いと認識していたのですが、それは誤りでしょうか?

グローバル変数を有するサーブレットクラスを作成し、2つのスレッドを流したところ、1つ目のスレッドでセットした値が、後追いで流した2つ目のスレッドでセットした値に置き換わってしまいました。

それぞれの値を関連性の無いようにしたいのですが
どのようにしたら良いのか、ご存知の方いらっしゃいましたらご教授願います。

宜しくお願い致します。

Aベストアンサー

その他の方法では
SingleThreadModelを実装する。

このパターンですと
リクエストごとにインスタンスを
生成するようになります。

方法は
public class Sample extend HttpServlet
    implements SingleThreadModel {
です。

Qサーブレットを動せるレンタルサーバについて

サーブレットを動せるレンタルサーバについて

現在、ロリポップ(チカッパプラン)という月額500円程度の(PHPやMySQLが使える)レンタルサーバを借りていますが、共用サーバですのでサーブレットが動かせないです。(tomcatやJDKをインストールすること自体不可能)

そこでレンタルサーバでサーブレットを動かそうとする場合、高価な専用レンタルサーバを借り、
tomcatのインストールやJDKの設定を全部自分でやらないといけないのでしょうか?
最初から既にサーブレットが動く環境(Apache+tomcat)がデフォルトで用意されすぐに利用できるようなレンタルサーバは通常ないものでしょうか?

現在、ローカル環境を2つ構築しており、(2)のようなサーブレットが動作する環境が最初から整ったレンタルサーバがないものかと考えています。
普通はレンタルサーバを借りてサーブレットを動かそうとすれば、tomcatやらJDKやら自分で専用サーバにインストール&設定するものなんでしょうか?それ以外に手法はありますか?

ローカル環境は2つ構築していています。
(1) windows7 Xampp(Apache2.2+tomcat7連携)JDK6
(2) 自宅サーバ:centOS5.6 Apache2.2+tomcat5.5連携 JDK5 

サーブレットを動せるレンタルサーバについて

現在、ロリポップ(チカッパプラン)という月額500円程度の(PHPやMySQLが使える)レンタルサーバを借りていますが、共用サーバですのでサーブレットが動かせないです。(tomcatやJDKをインストールすること自体不可能)

そこでレンタルサーバでサーブレットを動かそうとする場合、高価な専用レンタルサーバを借り、
tomcatのインストールやJDKの設定を全部自分でやらないといけないのでしょうか?
最初から既にサーブレットが動く環境(Apache+tomcat)がデフォル...続きを読む

Aベストアンサー

最初から環境が整ってるというわけではありませんが最近は比較的安価にVPSが提供されてますが、それではダメなんでしょうか?

Qservletのマルチスレッドとはどこまで意識をする必要があるのか?

「servletはマルチスレッドを意識して実装しなくてはいけない」とよく聞きます。

マルチスレッドを意識しなければならないのは、HttpServletを継承したクラスのみなのでしょうか?

それとも、そこからインスタンス化される汎用クラスなどもマルチスレッドを意識し、インスタンス変数は悪とされるのでしょうか?

となると、汎用クラスのコンストラクタ引数に値を渡し汎用クラス内でインスタンス変数を使用するってコーディングは完全なNGになりますよね。

HttpServlet継承のサーブレットからインスタンス化されれば、都度個別のメモリが割り当てられると思うのですが・・。

ご存知な方いらっしゃいましたらご教授お願いいたします。

以上

Aベストアンサー

> (1)サーブレットとして動く全てのクラスを現しているのでしょうか?
> (たとえば、Strutsなどで動く個別アクションモジュールも含めるのか、の意です)

HttpServlet、Actionクラスです。

> (2)それともHttpServletを継承したクラスのことでしょうか?
> (インスタンス化される個別アクションモジュールは含まない)

Strutsの場合、Actionクラスを継承したクラスも初めて実行された時にインスタンス化されコンテナに常駐されます。以降の実行はこのインスタンスのスレッドとして実行されます。よってservletのインスタンス変数は共有されるので意識しないといけません。

・・回答になっているでしょうか?

QJava サーブレット間の値の受渡について

こんにちは

サーブレットAからサーブレットBへ値を渡して、
サーブレットAで、戻り値を取得したいと考えています。

条件としては、
・サーブレットBの改修はできない
・サーブレットBへはGet,Postで値を渡すことができ、
戻り値を数値で貰える
というものです。

サーブレットA側からサーブレットBへリダイレクトするやり方はわかったのですが、それだと処理が完全にサーブレットBに移ってしまい、戻り値に応じた処理がサーブレットA側で行えないのです。
一般的なプログラミングのように、コールして戻り値に応じて処理を分ける・・といったことは出来ないのでしょうか?

Aベストアンサー

サーブレットAからBへリダイレクトしたのでは、そのままページを移るだけですからお望みのような働きにはなりません。

どうしてもというなら、サーブレットAの中から、URLConnectionでサーブレットBに接続をし、結果を受け取って処理する、というような形になるかと思います。要するに、サーブレットAの内部から、HTTPでサーブレットBにアクセスするわけです。

QJava(Servlet,JSP)を使用してあるURLにHTTPリクエスト(POST)を送信する方法

あるWeb APIを使用したWEBアプリケーションを作成しています.
JavaのServletやJSPで実装していますが,サンプルではGETでリクエストを送る方法だけが紹介されていました.
APIがPOSTに対応しているので,POSTでリクエストを送信しようと思います.
サンプルは以下のようになっていましたが,POSTでリクエストを送信する場合,どう変更すれば良いでしょうか?

URL url = new URL("http://xxxxxx.xx/xx/?q=" + URLEncoder.encode(request.getParameter("data"), "UTF-8"));
URLConnection con = url.openConnection();
InputStream stream = con.getInputStream();

リクエストは日本語を含むデータをパラメータに含める予定です.

Aベストアンサー

HttpURLConnection POST
でGoogleで検索すると沢山出てくるけどね。

わかりやすいのは
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22814&forum=12&6
ここかしら。


人気Q&Aランキング

おすすめ情報