- PR -

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

投稿者投稿内容
aco0000
会議室デビュー日: 2004/09/16
投稿数: 18
投稿日時: 2004-09-28 10:34
EJBについて調べたんですけど
難しくてよく分かりませんでした、、、。
また機会があったらやってみたいです
結局Socketのreadにタイムアウトをつけて
JSP起動時に時間をとりセッションの最終アクセス時間がそれより大きかったら
他のJSPが起動されたとみなし処理を中断することにしました

long thisJsptime = new Date().getTime();
int isis;
synchronized(session){
//タイムアウト設定 他のJSPの起動判定用
ss.setSoTimeout(1000);
//レスはmsg単位に読み書き
while(true){
try{
//1バイト読む
isis = sis.read();
//ソケットが切られた
if(isis == -1){ return; }
} catch (SocketTimeoutException ste){
//タイムアウト発生
if(thisJsptime<session.getLastAccessedTime()){
//次のJSPが起動してればおしまい
return;
} else {
//自分が最新のJspならまだ待つ
continue;
}
}
//普通に1バイト読めた場合
break;
}
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-29 01:43
そのコード、実際に動かして試してみましたか?
session に対して synchronized をかけていたら、同じセッションに対してアクセスしようとするスレッドは待たされることになります。
synchronized ブロック内が実行されている間に lastAccessedTime が更新されることはないはずです。
よって同時に処理が走ることはありませんが、要求が合った回数だけは直列化されて処理がおこなわれることになります。
aco0000
会議室デビュー日: 2004/09/16
投稿数: 18
投稿日時: 2004-09-29 05:10
なるほどそう言われてみれば、、、そうなのかな、、、?
ごめんなさい理解不足です
タイムアウト発生時のif文にデバッグコードを入れてみたところ
LastAccessedTimeが更新されてreturnによって抜けた後
次のスレッドがsynchronized(session)句に入っているように見受けられました
synchronized(session){}に入るときにsessionオブジェクトによる同期がとられるイメージでした
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-09-29 07:46
>synchronized(session){}に入るときにsessionオブジェクトによる
>同期がとられるイメージでした
そう、まさにその通りです!
やはり、後から処理が始まったら前の処理は停止するってのはかなり面倒です。

synchronized を使って実装するならこんな形になるでしょうか。
処理を始める前にフラグを立てるため前に書いたコードより同期待ちするスレッドが少なく少し効率的です。
コード:

if(null == session.getAttribute("started")){
synchronized(session){
//2重にチェックするのはちょっとミソです。
//2つ以上のスレッドが順番にこのブロックを実行する可能性がありますので
if(null !=session.getAttribute("started")){
//処理を始めた、ってフラグを立てる
session.setAttribute("started",new Object());
//行いたい処理
}
}
}




[ メッセージ編集済み 編集者: インギ 編集日時 2004-09-30 02:23 ]

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