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」については後述します。
