- PR -

画面の排他処理について

投稿者投稿内容
T_T
常連さん
会議室デビュー日: 2005/07/20
投稿数: 20
投稿日時: 2005-08-03 21:13
今Tomcat5&JSFでシステムの開発をしています。
そのシステムで画面単位で排他処理を行いたいらしく困っています。

どういうことかというと、例えば「A画面」と「B画面」の画面は
Webなのにどっちか一つしか開けないという仕様です。
A画面を開いてる人がいたらB画面は開けない。逆もしかり。

現状の仕様としては、それぞれの画面アクセス時に
DBアクセスしてチェック用テーブルにA画面のときならB画面を起動している人が
いないか確認しOKなら同様のテーブルにクライアントのマシン名と
アプリ名とアクセス時間をInsertしてます。
で、画面の終了時にInsertしたデータをマシン名をキーに削除します。

ここで、マシン名等はセッションに保存しているため
セッションタイムアウトになったらデータの削除ができなくなります。
これを消すためのいい方法ってないでしょうか?
もしくは、このDBに吐いてっていう設計がどんくさいと思うので
この画面の排他処理を実現するよい方法はないでしょうか?
やっぱスレッドとかで監視することになるのでしょうか?

皆様よろしくご教授ください!!

YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-08-03 22:01
HttpSessionListenerでは駄目ですか?
http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/http/HttpSessionListener.html

[ メッセージ編集済み 編集者: YOU@IT 編集日時 2005-08-03 22:02 ]
T_T
常連さん
会議室デビュー日: 2005/07/20
投稿数: 20
投稿日時: 2005-08-03 22:04
さっそくのご返答ありがとうございます。
いろいろ試したのですがHttpSessionListenerでは
Sessionが消えてからですのでやっぱり
InsertしたものをDeleteすること(マシン名をキーに削除)が
できません。
Sessionタイムアウトの直前をハンドリングは
できないのでしょうか・・・・
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2005-08-03 23:34
タイムアウトだけなら、セッションIDをキーにしても良い気がします。
#どのみち、二画面目はマシン名で問い合わせるのでしょうから。

もしくは、サーブレットコンテキストにセッションIDをキーに参照を
持たせておくとか。

他には、定期的にクリーンアップジョブを流すとかでしょうか。
#アクセス時間+タイムアウト時刻を越えて残っているのは、全て破棄対象。


・・・
ラフに考えてるので、どこかに穴がありそうな気がしてますが

----
補足:「テーブルレイアウトにセッションIDを追加」を忘れていました(汗



[ メッセージ編集済み 編集者: キルシェ 編集日時 2005-08-03 23:37 ]
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-08-03 23:37
あれ、HttpSessionListenerってセッション切れる前に
ハンドリングできませんでしたっけ?

確かJ2EE1.3まではsessionが破棄された後にハンドリング
されてたような気がしますけど、1.4からはきちんと切れる前に
ハンドリングできていたような気がします。
# バージョンが合っているかは不確か

tomcat5でしたら大丈夫じゃないですか?
既に試された結果、sessionが切れていたのでしょうか?
T_T
常連さん
会議室デビュー日: 2005/07/20
投稿数: 20
投稿日時: 2005-08-03 23:46
皆様さっそくのご返答本当にありがとうございます。
キルシェさんの仰る通りマシン名をキーにするより、セッションIDをキーにした方が
よいような気がします。修正してみます。

(株)ぽちさん
HttpSessionListenerってセッション切れる前に
ハンドリングできるんですか?
いろいろ試したのですが
セッションタイムアウトの起こし方が悪いのか
セッション情報は消えています。
HttpSessionListenerでセッションの切れる前に
ハンドリングしているかどのように
確認すればよいでしょうか?

勉強不足でいろいろと質問して申し訳ないですが
よろしくお願い致します。
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2005-08-04 00:09
一応、念のために・・・

・同一マシンで複数ブラウズ(個別にブラウザを起動 … セッションIDが別のパターン)
・異なるマシンで同名ログイン

は確認しておいたほうが良いかと。
#ブラウザ(IE)の ファイル-新規作成-ウィンドウ(セッションIDが同一のパターン) は不可能だと思いますが。
yu-ame
会議室デビュー日: 2004/07/22
投稿数: 4
投稿日時: 2005-08-04 09:57
画面で排他で今の方法だといきなりブラウザ落とされたらタイムアウトするまで
使えなくなるんじゃないだろうか?

A画面が開いたときにランダムなキーとアクセス時間をコンテキストにつっこむ
A画面はIFrameとかXMLHttpRequestとかで10秒とかのサイクルでそのキーをもって
リクエストを送ってアクセス時間を更新する。
B画面はコンテキストみて排他する。アクセス時間が20秒以上たってたらA画面のアクセスはないとみなしアクセスできるようにする。A画面用のキーも消す。

VMが2個あったらDBだろうけど。

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