Cohesion Framework チュートリアル

トップ / チュートリアルトップ

3.Cohesion Frameworkの仕組み

Cohesion Framework動作フロー

モジュールを作る前に、ざっくりとCohesion Frameworkがどうやって動いているのかをご説明します。 流れは以下のような感じです。

Main.swf起動
  ↓
CHConfig.swfを読み込む
どこのサーバに接続するかとか、ポートは何番を使うかとかはCHConfigに書いておいてください。
Main.swfはこのファイルにある情報を元にソケットサーバへと接続します。
  ↓
CHConfigの情報を元にソケットサーバへ接続
  ↓
サーバから一番最初に起動するモジュールが指定される
  ↓
指定されたモジュール起動
チュートリアルの場合だと、Loginモジュール(modules/Login.swf)が起動されます。

Cohesion Frameworkを使った作業とは

Cohesion Frameworkを利用してマルチユーザソケットアプリケーションを作るという作業は、 具体的にはCohesion Framework(≒Main.swf)に読み込まれる「モジュール」と、サーバ側での処理を定義した「サービス」を作っていく作業になります。 ソケットの操作(接続や送受信)や、モジュールのローディングはCohesion Frameworkで自動的に行いますので、気にしなくても大丈夫です。 また、サーバ側の「サービス」はJavaScriptでも書けますので、Javaだのコンパイルだの知らなくても大丈夫なようになっています。

「モジュール」と「サービス」

さて、この「モジュール」と「サービス」の関係です。Cohesion Frameworkでは、間に「Kernel」という物を挟んでメッセージのやり取りを行います。

モジュールからサービスに連絡するには、

service("サービス名").関数(引数, 引数, ...);

という関数を使用してください。

例えば、Loginモジュールのflex/LoginModule/LoginFormGadget.asをご覧ください。 このソースの204行目で、サービスに連絡しています。

204: service("Login").login(kernel, tfUserid.text);

これは、Loginサービスのloginメソッドを実行せよ、といった意味になります。いわゆるRPC、リモートプロシージャコールのようなものだとお考えください。 これを受けて裏でKernelがサーバへ、メソッド実行用のXMLメッセージを送信します。
(詳しくはappendix A swfからのサーバサービスの呼び出し方を参照)

ソケットサーバはKernelからのXMLメッセージを受けると、指定されたサービスのメソッドを実行します。 具体的には、gpss2/scripts/LoginService.js をご覧ください。このサービスには、functionがひとつだけ定義してあります。 さきほどのXMLメッセージをソケットサーバが受け取ると、このファイルの login 関数がサーバ側で実行される、といった流れになります。

それでは次は、「サービス」側から「モジュール」へ連絡する方法です。 サービスからの連絡には現在2つの種類があります。「イベントの励起」と「モジュールのロード」です。

「モジュールのロード」の方は読んで字の如く、KernelがサーバからこのXMLメッセージを受け取ると、自動的に指定されたモジュール(modulesディレクトリ以下にあるswfファイル)を読み込みます。 Kernelはモジュールのロードが完了すると、そのモジュールのinitializeメソッドとlaunchメソッドを実行します。 この辺、詳しくはまた後述します。

サンプルの例だと、真っ先にLoginモジュール(Login.swf)を読み込むように、サーバから連絡が来ています。

問題はもうひとつの方、「イベントの励起」です。

Cohesion Frameworkでは、サービスからの連絡をモジュールが受け取るのに「イベント駆動方式」を採用しています。 1回のサーバからの連絡を、複数のモジュールでも受け取りまた処理するために、このような方法を採っています。 また、Flash/ActionScriptプログラミングは基本的にイベント駆動ですので、他のコードとの親和性も高いかと思います。

そのため、モジュールは予めKernelに対して addEventListener しておく必要があります。

Kernelがサーバから「イベントの励起」の連絡を受け取ると、Kernelはイベントを励起してaddEventListenerで登録されたリスナ関数が実行されます。 ちょっとややこしくなってきましたね。
(詳しくはappendix B JavaScriptサーバサービスからswfへの連絡方法を参照)

サービスを作るには、いくつかの注意事項があります。

まず、サービス用のJavaScriptのファイル名ですが、さきほどの service ファンクションの引数で指定した「サービス名」に"Service.js"をつけた形に必ずしてください。 先の例ですと、「Login」サービスを作るのだから、ファイル名は「LoginService.js」とする必要があります。

また、サービスに関数を追加定義する際、その関数の1番目の引数は必ず「kernel」としてください。 この「kernel」については後述します。


戻る 次へ進む?