- PR -

HTTPセッションでの単一起動

投稿者投稿内容
aco0000
会議室デビュー日: 2004/09/16
投稿数: 18
投稿日時: 2004-09-21 06:41
一つのHTTPセッションあたりJSPを一つだけ起動させるようにしたいです
リクエストがあった場合、それ以前に同一セッションで起動しているJSPがあったら停止してしまいたいのです
そのような処理は可能でしょうか?
可能であればどのような方法で可能でしょうか?
ご教授願います

[ メッセージ編集済み 編集者: aco0000 編集日時 2004-09-21 06:42 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-21 06:57
実行中のスレッドを停止したい、ってことでしょうか?
であればできません。
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html#destroy()
同期をとって後のリクエストで行われる処理をスキップするのはいかがでしょうか?
synchronized(session){
if(null == session.getAttribute()){
doWhatUWant();
}else{
//otherwise skip the process
}
session.setAttribute("done",new Object());
}
aco0000
会議室デビュー日: 2004/09/16
投稿数: 18
投稿日時: 2004-09-21 07:44
返答ありがとうございます
停止したいjspはソケットからのreadで待ち状態になっています
なので同期処理を取った場合後から起動されたJSPのほうが
synchronizedで待ち状態になってしまうのではないかなーと思っています
説明不足ですみません

synchronized(session)とはセッション単位で同期が取れるんですか?
なるほど参考になりました

今は
synchronized(session){
//前のスレッドを停止
Thread bth = (Thread)session.getAttribute("thread");
if(bth!=null) bth.interrupt();
//自分を登録
session.setAttribute("thread",Thread.currentThread());
}

みたいな感じで出来ないかなーとおもっています


[ メッセージ編集済み 編集者: aco0000 編集日時 2004-09-21 07:49 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-21 07:59
>停止したいjspはソケットからのreadで待ち状態になっています
、とは限らないのではないでしょうか?
>synchronizedで待ち状態になってしまうのではないかなーと思っています
その通りです。ちょっと具体的な目的が見えてこないので分かりませんが、実装的には前に起動した処理がどこで終わるか分からないで後の処理を始めるよりも、前の処理をしっかり終わらせて後の処理をしない方が確実ではないでしょうか?
aco0000
会議室デビュー日: 2004/09/16
投稿数: 18
投稿日時: 2004-09-21 08:26
たびたび返答ありがとうございます
なるほど
えー今やっていることはHTTPセッションをつかって擬似的にソケットをキープするということをやっています
イメージ的には
サーバ=socket=プロキシ=HTTPセッション=クライアント
という感じです
ただいまJSPといっているものはこのプロキシにあたるものです
サーバに対するソケットはセッションにsetAttributeして使いまわしてます
クライアントからPOSTでデータを送信するときにHTTPの返答待ち状態になっているコネクションをクローズしますがそれがJSPに伝わらないためサーバからの返答が残ったJSPにとられてしまうのです
クライアントは次のJSPにコネクションを張っているため古いJSPにとられた分データがずれてしまいます
かなり無理をしているのは分かっているのですが、クライアントがHTTPしか使えないためこのような方法をとるしかありません

>ちょっと具体的な目的が見えてこないので分かりませんが、実装的には前に起動した処理がどこで終わるか分からないで後の処理を始めるよりも、前の処理をしっかり終わらせて後の処理をしない方が確実ではないでしょうか?
たしかにそうかもしれません
前の処理でデータを受け取ってセッションのAttributeでデータを受け渡すという方法になってしまうのでちょっと煩雑かなーと思っています

[ メッセージ編集済み 編集者: aco0000 編集日時 2004-09-21 08:29 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-21 08:32
んー、やりたいことから想像するに Stateful Session Bean を使うと良いかもしれません。
EJB は同一の bean へのアクセスはかならずシングルスレッドで行われることが保証されますので。
また http トンネリングでアクセスすることも簡単にできますので、煩雑な処理を自前で用意することなくビジネスロジックに専念することができます。
aco0000
会議室デビュー日: 2004/09/16
投稿数: 18
投稿日時: 2004-09-21 08:44
ありがとうございます
そういうものがあるとは知りませんでした
ちょっと調べてみたいと思います
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-21 09:12
EJB はアンチ派も多いですがそんな難しいものではありませんのでちょっと勉強してみると面白いかもしれません。
こんなのとかいいかもしれません→BEA WebLogic Server 8.1J EJB 2.0徹底攻略

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