SimpleSessionTestを使った更なる実験
|
SimpleSessionTestを使った更なる実験
実際の業務では、皆さんが開発したサーブレットやJSPページは、いろいろのクライアントの操作や、環境にさらされる。ここでは、クライアントの結びつきの基本となるHttpSessionのオブジェクトやそれをサポートするサーブレット・エンジンが、どのような振舞いをするのかを実習する。
まずコメントアウトされていたThread.sleep(10000L); という行を活かして、要求あたり10秒の処理時間を持たせよう。
1) 同じクライアントが、最初の「更新」ボタンの処理終了前に、再び「更新」ボタンをクリックして新たな要求を送信した場合
この場合は、最初の「更新」による要求でvisitTimesは更新されたものの、応答を返すためのTCP接続が切れてしまっているのでエンジン側で例外が発生してその応答はキャンセルされ、その次の「更新」による要求に対応する応答がクライアントに返されるが、visitTimesは2回インクリメントされた結果が返される。このサーブレットの場合はこれで構わないが、アプリケーションによっては対処が必要になる。
2) 複数のクライアントにもこのサーブレットが対応していることの確認
Windowsデスクトップ画面のスタートボタンの横にあるラウンチャのなかのInternet ExplorerやNetscape Navigatorの起動ボタンを2回押してブラウザを二つ立ち上げ、それをデスクトップ上に並べて動作させ、http://localhost:8080/SimpleSessionTestを交互に呼び出す。更に「更新」ボタンをともにクリックしてもお互いが干渉することなく正しい結果がえられることを確認する。
3) このサーブレットがSingleThreadModelを実装していて複数のインスタンスが存在していても正常に機能することの確認
このサーブレットのコードのクラス宣言の行を次のように変更する。
public class SimpleSessionTest extends HttpServlet implements SingleThreadModel { |
しかるのちサーブレット・エンジンを再始動する。この状態で2)でやったと同じ実験をされたい。これも問題が無いことが確認されよう。なおWebSphereでは、サーブレットのログには次のように記録され、5つのインスタンスが用意されたことがわかる。
[01.06.29 14:42:34:760 JST] 6b1a ServletInstan A SRVE0048I: サーブレットのロード :
"SimpleSessionTest" [01.06.29 14:42:36:020 JST] 6b1a WebGroup A SRVE0091I: [Servlet LOG]:
"SimpleSessionTest: init" [01.06.29 14:42:36:130 JST] 6b1a WebGroup A SRVE0091I: [Servlet LOG]:
"SimpleSessionTest: init" [01.06.29 14:42:36:190 JST] 6b1a WebGroup A SRVE0091I: [Servlet LOG]:
"SimpleSessionTest: init" [01.06.29 14:42:36:240 JST] 6b1a WebGroup A SRVE0091I: [Servlet LOG]:
"SimpleSessionTest: init" [01.06.29 14:42:36:240 JST] 6b1a WebGroup A SRVE0091I: [Servlet LOG]: "SimpleSessionTest: init" |
4) クライアントが長時間アクセスしなかった場合
デフォルトではWebSphereのサーブレット・エンジンは30分をタイムアウトとしているが、これは実験用には長すぎるので、以下の行を追加して60秒に短縮して試してみよう。
//到来要求が最初かどうか調べる HttpSession session = request.getSession(); session.setMaxInactiveInterval(60); |
WebSphereのサーブレット・エンジンではタイムアウトは機能し、visitTimesは1にリセットされるが、その時間間隔は設定時間よりかなり長く、正確ではなかった。