- - PR -
画面の排他処理について
1|2|3
次のページへ»
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-03 21:13
今Tomcat5&JSFでシステムの開発をしています。
そのシステムで画面単位で排他処理を行いたいらしく困っています。 どういうことかというと、例えば「A画面」と「B画面」の画面は Webなのにどっちか一つしか開けないという仕様です。 A画面を開いてる人がいたらB画面は開けない。逆もしかり。 現状の仕様としては、それぞれの画面アクセス時に DBアクセスしてチェック用テーブルにA画面のときならB画面を起動している人が いないか確認しOKなら同様のテーブルにクライアントのマシン名と アプリ名とアクセス時間をInsertしてます。 で、画面の終了時にInsertしたデータをマシン名をキーに削除します。 ここで、マシン名等はセッションに保存しているため セッションタイムアウトになったらデータの削除ができなくなります。 これを消すためのいい方法ってないでしょうか? もしくは、このDBに吐いてっていう設計がどんくさいと思うので この画面の排他処理を実現するよい方法はないでしょうか? やっぱスレッドとかで監視することになるのでしょうか? 皆様よろしくご教授ください!! |
|
投稿日時: 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 ] |
|
投稿日時: 2005-08-03 22:04
さっそくのご返答ありがとうございます。
いろいろ試したのですがHttpSessionListenerでは Sessionが消えてからですのでやっぱり InsertしたものをDeleteすること(マシン名をキーに削除)が できません。 Sessionタイムアウトの直前をハンドリングは できないのでしょうか・・・・ |
|
投稿日時: 2005-08-03 23:34
タイムアウトだけなら、セッションIDをキーにしても良い気がします。
#どのみち、二画面目はマシン名で問い合わせるのでしょうから。 もしくは、サーブレットコンテキストにセッションIDをキーに参照を 持たせておくとか。 他には、定期的にクリーンアップジョブを流すとかでしょうか。 #アクセス時間+タイムアウト時刻を越えて残っているのは、全て破棄対象。 ・・・ ラフに考えてるので、どこかに穴がありそうな気がしてますが; ---- 補足:「テーブルレイアウトにセッションIDを追加」を忘れていました(汗 [ メッセージ編集済み 編集者: キルシェ 編集日時 2005-08-03 23:37 ] |
|
投稿日時: 2005-08-03 23:37
あれ、HttpSessionListenerってセッション切れる前に
ハンドリングできませんでしたっけ? 確かJ2EE1.3まではsessionが破棄された後にハンドリング されてたような気がしますけど、1.4からはきちんと切れる前に ハンドリングできていたような気がします。 # バージョンが合っているかは不確か tomcat5でしたら大丈夫じゃないですか? 既に試された結果、sessionが切れていたのでしょうか? |
|
投稿日時: 2005-08-03 23:46
皆様さっそくのご返答本当にありがとうございます。
キルシェさんの仰る通りマシン名をキーにするより、セッションIDをキーにした方が よいような気がします。修正してみます。 (株)ぽちさん HttpSessionListenerってセッション切れる前に ハンドリングできるんですか? いろいろ試したのですが セッションタイムアウトの起こし方が悪いのか セッション情報は消えています。 HttpSessionListenerでセッションの切れる前に ハンドリングしているかどのように 確認すればよいでしょうか? 勉強不足でいろいろと質問して申し訳ないですが よろしくお願い致します。 |
|
投稿日時: 2005-08-04 00:09
一応、念のために・・・
・同一マシンで複数ブラウズ(個別にブラウザを起動 … セッションIDが別のパターン) ・異なるマシンで同名ログイン は確認しておいたほうが良いかと。 #ブラウザ(IE)の ファイル-新規作成-ウィンドウ(セッションIDが同一のパターン) は不可能だと思いますが。 |
|
投稿日時: 2005-08-04 09:57
画面で排他で今の方法だといきなりブラウザ落とされたらタイムアウトするまで
使えなくなるんじゃないだろうか? A画面が開いたときにランダムなキーとアクセス時間をコンテキストにつっこむ A画面はIFrameとかXMLHttpRequestとかで10秒とかのサイクルでそのキーをもって リクエストを送ってアクセス時間を更新する。 B画面はコンテキストみて排他する。アクセス時間が20秒以上たってたらA画面のアクセスはないとみなしアクセスできるようにする。A画面用のキーも消す。 VMが2個あったらDBだろうけど。 |
1|2|3
次のページへ»