カスタム検索

2009年4月3日金曜日

merapiがもたらすAirとJavaの素敵な関係

Air(Flex)でJavaを呼び出すという夢のようなライブラリが登場したようです。
まだベータですが試してみましたのでつらつらと書いていきます。

参考
公式サイト
マイコミの紹介
javaとairを繋ぐmerapiを使ってみた。


まずはJava側の実装から



merapi本体を解凍した中にある framework/java/libs にあるのがJava側で必要なライブラリ
適当なクラスを作って、IMessageHandler を implements する

public static void main の中で Bridge クラスに、自身を regist する


public class MerapiTest implements IMessageHandler {
public static void main(String[] args) {
System.out.println("start");
Bridge.getInstance().registerMessageHandler("merapiSample", new MerapiTest());
}
}


第一引数でBridgeに登録するID(タイプと呼ぶらしい)、第二引数が自身のJavaクラスのインスタンス

flexから呼ばれた時に handleMessage がcallされるのでこれをクラスに書いておく(インターフェース定義されてます)


public void handleMessage(IMessage obj) {
try {
System.out.println("flex > java :"+((Message)obj).getData());
Message response = new Message("merapiSample", "hello merapi");
Bridge.getInstance().sendMessage(response);
} catch(Exception e) {
System.out.println("Caught Exception");
}
}


IMessageというのがFlexから受け取るデータ、MessageにキャストしてgetDataすると中身を取得出来る。
System.out.println("flex > java :"+((Message)obj).getData());

void なんで return値はなし、Flexに情報を返したい場合は Bridge の sendMessageを使う。
Messageの第一引数にregistしたのと同じIDを指定、第二引数に送りたいデータをセットする。
Message response = new Message("merapiSample", "hello merapi");
Bridge.getInstance().sendMessage(response);

続いてFlex側の実装



merapi本体を解凍した中にある framework/flex/libs にあるのがflex側で必要なライブラリ

まずはBridgeのインスタンスを作成する

<merapi:BridgeInstance id="bridge" result="handleMessage(event)" />


こっちはresultのfunction名を指定出来る、Javaと同じにしとといた方がわかりやすいかもね!

メッセージの送信は以下のように

var message:Message = new Message("merapiSample","from flex");
bridge.sendMessage(message);


MessageクラスはJavaとおんなじ使い方でOK

実行方法


まずは java のクラスを起動してやる必要がある
起動して regist した時点で listen 状態で待機される

この状態でFlexを起動してやると、メッセージを送信出来る
Flexが終了した時点でJavaも落ちる

欠点はJavaを起動する必要がある所かな・・・
終了は一緒に終わってくれるので問題なさそうだけど、Airの起動時にJavaが動いてないとエラーになるんで
なんとかしてJavaを起動してAirを起動するような仕組みが必要

うまく使えばクライアントサイドで今以上に色んな事が出来そうですね!
Grailsとの絡みで考えると、Grails1.1からGORMが単体で使えるようになっているのでsqliteを使った生なDBでなく、GORMを使ってHSQLとかでクライアントDBを実装出来たら素敵な気がする!

0 件のコメント: