ひがやすを技術ブログ

電通国際情報サービスのプログラマ

会話スコープ

Webアプリケーションのスコープは、基本的に、リクエスト、セッション、アプリケーションの三つですが、リクエストよりは、長くセッションよりは短いスコープを扱うフレームワークが増えてきました。
このスコープは、会話スコープといわれることが多く、会話を開始して終了するまでの間、そのスコープにおいたオブジェクトが維持され、終了した後、自動的に破棄されます。セッションにはあまり長くオブジェクトを置きたくない、自動的にセッションのオブジェクトを破棄してほしい、これが会話スコープの目的です。
会話スコープを持っているフレームワークとしては、Spring Web flow、ShaleSeamTeedaなどがあります。Spring Web flowとSeamの機能は非常に良く似ていて、XMLで会話のスコープを定義します。Seamは、定義はXMLで行いますが、jBPMのツールを書けば簡単に書けるっぽい。Seamは会話の開始と終了は、アノテーションで指定します。
会話スコープは、あると便利なものですが、いちいち設定ファイルを書くのはかったるい。Teedaでは、あるウィンドウ上で新たなサブアプリケーションが使われると自動的に会話を開始し、別のサブアプリケーションが使われると自動的に、元のサブアプリケーション用の会話を終了させます。サブアプリケーションというのは、複数のHTMLをひとまとめにしたもので、物理的には、HTMLを格納するディレクトリが一つのサブアプリケーションになります。
たとえば、/emp/empList.htmlを表示させると、empサブアプリケーションの会話が開始されます。その後、/emp/*.htmlを表示させている間は、会話スコープは維持され、/dept/deptList.htmlなどの他のサブアプリケーションが表示されると、自動的にempサブアプリケーションのスコープは破棄されます。
この自動的な会話スコープは、他のフレームワークにはないTeedaの魅力的な機能の一つです。会話のスコープの終了が明示的に設定されているその他のフレームワークは、ユーザが予期せぬオペレーションをして会話のスコープの終了用のメソッドが呼び出されないと、タイムアウトするまで、会話スコープのオブジェクトはリークしてしまいます。Teedaの場合は、他のサブアプリケーションに遷移すると自動的に会話スコープを破棄するので、予期せぬオペレーションにも対応できます。さすがに、ブラウザをいきなり終了させると無理ですが。
同じサブアプリケーションでも、違うウィンドウで表示させていれば、自動的に別の会話スコープになります。