Documentation/Tutorials/ScopesAndContexts

スコープとコンテキスト

概要

ここでは、Red5 における

スコープ

コンテキスト

について説明します。アプリケーションモデルをサポートする Red5 のスコープモデルは、FMS のアプリケーションモデルを拡張したものです。Red5 のコンテキストモデルに相当するものは、FMS にはありません。これら 2 つのコンセプトは Red5 に固有のものです。

スコープのコンセプト

リソースは Red5 ではツリーで管理されます。ツリーの各ノードはスコープと呼ばれます。スコープがリーフノード (葉ノード) である場合、そのスコープは基本スコープ (BasicScope) と呼ばれ、スコープに子スコープが含まれている場合、そのスコープはスコープ (Scope) と呼ばれます。Red5 には、共有オブジェクト (SharedObject) スコープとブロードキャストストリーム (BroadcastStream) スコープという、2 つのあらかじめ定義された基本スコープがあります。

各アプリケーションは独自のスコープ階層構造を持っており、ルームスコープはウェブスコープ (WebScope) です。Red5 では、複数のアプリケーションにまたがって共通のリソースを共有することを目的としたグローバルなスコープが定義されています。これがグローバルスコープ (GlobalScope) です。グローバルスコープは、すべてのウェブスコープの親です。その間にあるほかのスコープは、すべてがスコープのインスタンスです。各スコープには名前があります。グローバルスコープの名前は、"default" です。ウェブスコープの名前は、アプリケーションコンテキスト名です。スコープの名前は、パス名です。共有オブジェクトスコープの名前は、共有オブジェクトの名前です。ブロードキャストストリームの名前は、ストリームの名前です。

グローバルスコープと基本スコープを除き、すべてのスコープはクライアントから接続できます。スコープオブジェクトは、クライアントからの接続リクエストの結果として作成されることがあります。たとえば、クライアントは、room0 スコープが存在しないときに、oflaDemo/room0 への接続リクエストを発行することができます。この場合、接続が確立された後に room0 が作成されます。URL に多数の中間スコープが含まれる場合、これらのスコープがすべて作成されます。たとえば、oflaDemo/lobby0/room0 がリクエストされて、lobby0 も room0 もどちらも存在しない場合、lobby0 と room0 が作成されます。ついで、接続は room0 スコープと結び付けられます。

次に示すのは、典型的なスコープの階層構造です。

GlobalScope(default) --> WebScope(oflaDemo) --> Scope(room0) --> BroadcastStream(live0), SharedObject(so1)
                                            --> Scope(room1) --> SharedObject(so0)
                     --> WebScope(fitcDemo) --> Scope(room1) --> BroadcastStream(live0)

スタンドアロンバージョンの場合、グローバルスコープオブジェクトは webapps/red5-default.xml で定義されます。WAR バージョンの場合、グローバルスコープオブジェクトはウェブスコープオブジェクトとともに conf/war/applicationContext.xml で定義されます。

スコープの機能

ツリー構造の反復のほかに、スコープはリソース解決の機能とサービス登録の機能を提供します。また、スコープに現在接続されている一連の接続オブジェクトの管理も行います。スコープには ScopeHandler を注入することができ、スコープの作成、破棄、接続といったスコープの活動を監視することができます。

コンテキスト

コンテキストはスコープオブジェクトに貼り付いているもので、スコープオブジェクトに対してさまざまな追加のサービスを提供します。コンテキストオブジェクトは、IContext.getScope() を呼び出すことで取得できます。コンテキストは spring アプリケーションコンテキストをラップし、サービスを spring bean として宣言して、コンテキストから参照できるようにします。その他のサービスには、"clientRegistry"、"serviceInvoker"、"persistenceStore"、"mappingStrategy"、さらに、スコープで提供されているリソースリゾルバを支えるリソースリゾルバがあります。コンテキストの詳細については、org.red5.server.api.IContext を参照してください。

コンテキストは継承できます。これは、スコープがコンテキストを定義することができず、その親のコンテキストを直接使うことを意味します。独自のコンテキストオブジェクトを使用するのは、グローバルスコープとウェブスコープだけです。