- - PR -
HTTPセッションでの単一起動
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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; } | ||||
|
投稿日時: 2004-09-29 01:43
そのコード、実際に動かして試してみましたか?
session に対して synchronized をかけていたら、同じセッションに対してアクセスしようとするスレッドは待たされることになります。 synchronized ブロック内が実行されている間に lastAccessedTime が更新されることはないはずです。 よって同時に処理が走ることはありませんが、要求が合った回数だけは直列化されて処理がおこなわれることになります。 | ||||
|
投稿日時: 2004-09-29 05:10
なるほどそう言われてみれば、、、そうなのかな、、、?
ごめんなさい理解不足です タイムアウト発生時のif文にデバッグコードを入れてみたところ LastAccessedTimeが更新されてreturnによって抜けた後 次のスレッドがsynchronized(session)句に入っているように見受けられました synchronized(session){}に入るときにsessionオブジェクトによる同期がとられるイメージでした | ||||
|
投稿日時: 2004-09-29 07:46
>synchronized(session){}に入るときにsessionオブジェクトによる
>同期がとられるイメージでした そう、まさにその通りです! やはり、後から処理が始まったら前の処理は停止するってのはかなり面倒です。 synchronized を使って実装するならこんな形になるでしょうか。 処理を始める前にフラグを立てるため前に書いたコードより同期待ちするスレッドが少なく少し効率的です。
[ メッセージ編集済み 編集者: インギ 編集日時 2004-09-30 02:23 ] |