アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。

使用ツール:Tomcat 6.0

前提条件:Tomcatのserver.xmlでmaxThreads="1"と記述し、同時にスレッドが1つしか動作しないようにしている

質問:
ブラウザでDBに登録されている全ての情報を取得し表示する時の動作。

ブラウザ(情報取得ボタン押下)

サーブレット:DB(情報取得)

ブラウザ(結果出力)

 DBからの情報取得の処理が多少時間がかかってしまうため、その間にブラウザの中止ボタンが押下されてしまう場合があります。
 その場合、ブラウザ⇔HTTPサーバ(Tomcat)でのセッションは切れているのですが、サーブレットの処理は継続して行われています。
 再度、情報取得ボタンが押下されると、前提条件でスレッドが1つしか作成しないようにしているため、前の処理が終了するまで待機しするという形になっています。
 この場合、中止→取得→中止→取得と何度も繰り返される(IEの場合取得ボタンを連打でも可)と、さらに結果の出力が遅くなるということがおきてしまいます。

 これを解決するために、Tomcatが新しいリクエストを受け取った場合、現在のスレッドを破棄するといった形にできればと考えています。

 上記の考えで調査を行っているのですが、良い情報を見つけることが出来ません。
 
 実際にTomcatが現在実行中のスレッドを破棄し、新しいリクエストを受付けて処理を実行するといったようなことはできるのでしょうか?

 ご存知の方がいらっしゃったら、どうか助言をよろしくお願いいたします。

A 回答 (1件)

 多分というか間違いなく(少なくとも質問者が望む内容の)回答がつかないと思うので、何の回答にもなっていないのを承知で少しだけお話を。



> 実際にTomcatが現在実行中のスレッドを破棄し、新しいリクエストを受付けて処理を実行するといったようなことはできるのでしょうか?
 仮にこんな事が発生したらそんなWebサーバー誰も使わんよね。正直HTTPサーバーとしてというかサーバー(サービスを提供する側)としてありえない動作だよね。新しい客が来たら今の客を放り出すって言ってんだから。なのでそんな機能は絶対に実装されていないと思います。

 リスナーとかフィルターとか使っても多分無理だよね。フィルターの手前でブロックされると思う。
 Tomcatの中身(スレッドプールを管理しているあたり)をがりがりいじればできるかも知れませんが、そんな事はしたくないですよね?

 ・・・・今これを書いてて思いついたんだけど、maxThreads="2"にしておいて、スレッドが一つ動いている最中にもう一つのスレッドが来た時、フィルターやサーブレットの先頭で自前でブロックしておくというのはどうかな。後はその2つのスレッド間で同期を取ってやればひょっとしたらなんとかできるかも知れない。
    • good
    • 0
この回答へのお礼

お早い解答をありがとうございます

>仮にこんな事が発生したらそんなWebサーバー誰も使わんよね。正直HTTPサーバーとしてというかサーバー(サービスを提供する側)としてありえない動作だよね。新しい客が来たら今の客を放り出すって言ってんだから。なのでそんな機能は絶対に実装されていないと思います。

確かに複数人の処理を扱うサーバとしてはおかしな動きですね。
ご指摘を受けるまで1人の人の動作という観点で考えていたので、前の処理を破棄するのが妥当かな?と考えておりました。

後の指示を待たせないように処理する場合、Tomcatでスレッドを1つに制限するという行為自体がおかしいということなのでしょうか?

maxThreads="2"に関しては試行してみますね

お礼日時:2009/04/20 10:31

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