2010年4月5日月曜日

BlazeDS入門記(Example BlazeDS applications)

Getting started with BlazeDS / Introduction to BlazeDS / Example BlazeDS applications

今回は、ほとんどマニュアルをなぞってるだけです。

RPC service example

Remoting Service は BlazeDS に含まれる RPC サービスの1つです。クライアントは Remoting Service によりサーバ上の POJO にアクセスできます。

この例では、クライアントから渡された文字列をエコーバックする EchoService.java という java のクラスをサーバ上にデプロイします。

EchoService.java
package remoting;
public class EchoService
{
    public String echo(String text) {
        return "Server says: I received '" + text + "' from you";
    }
}
echo()メソッドは String の引数を受け、それにテキストを付加したものを返します。EchoService.java をコンパイル後、EchoService.class を WEB-INF/classes/remoting ディレクトリ以下に配置します。java クラスが BlazeDS に一切依存していないところが重要。

destination を定義し、ひとつ以上の channel を参照します。WEB-INF/flex/remoting-config.xml を編集して、EchoService.class を Remoting Service の destination として設定します。
<destination id="echoServiceDestination" channels="my-amf">
    <properties>
        <source>remoting.EchoService</source>
    </properties>
</destination>
source 要素は java クラスを参照しています。そして channels 属性は my-amf という名前の channel を参照します。

以下のように WEB-INF/flex/services-config.xml に my-amf channel を定義します。
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
    <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" 
        class="flex.messaging.endpoints.AMFEndpoint"/>
    <properties>
        <polling-enabled>false</polling-enabled>
    </properties>
</channel-definition>
この channel 定義は Flex クライアントがサーバ上の AMFEndpoint に non-polling AMFChannel を使用することを指定しています。

今回作成する Flex client application は EchoService へのアクセスに RemoteObject コンポーネントを使用します。RemoteObject コンポーネントは destination を特定するために destination を使用します。ユーザがボタンをクリックすると、サーバ上の echo() メソッドが呼び出されます。
<?xml version="1.0"?>
<!-- intro\intro_remoting.mxml --> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="100%" height="100%">

    <mx:Script>
        <![CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;

            // Send the message in response to a Button click.
            private function echo():void {
                var text:String = ti.text;
                remoteObject.echo(text);
            }

            // Handle the recevied message.
            private function resultHandler(event:ResultEvent):void {
                ta.text += "Server responded: "+ event.result + "\n";
            }

            // Handle a message fault.
            private function faultHandler(event:FaultEvent):void {
                ta.text += "Received fault: " + event.fault + "\n";
            }
        ]]>
    </mx:Script>

    <mx:RemoteObject id="remoteObject"
        destination="echoServiceDestination"
        result="resultHandler(event);"
        fault="faultHandler(event);"/>
        
    <mx:Label text="Enter a text for the server to echo"/>
    <mx:TextInput id="ti" text="Hello World!"/>
    <mx:Button label="Send" click="echo();"/>
    <mx:TextArea id="ta" width="100%" height="100%"/>
</mx:Application>
Flash Builder か mxmlc コンパイラを使用してクライアントアプリケーションを SWF ファイルにコンパイルし、Webアプリケーションにデプロイします。


Messaging Service example

クライアントアプリケーションは、Messaging Service により他のクライアントとのメッセージの送受信ができます。今回の例では、同一の BlazeDS destination へのメッセージの送受信をする Flex アプリケーションを作成します。

次のように WEB-INF/flex/messaging-config.xml に messaging destination を定義します。
<destination id="MessagingDestination" channels="my-amf-poll"/>
次のように WEB-INF/flex/services-config.xml に my-amf-poll channel を定義します。
<channel-definition id="my-amf-poll" class="mx.messaging.channels.AMFChannel">
    <endpoint
        url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpoll"
        class="flex.messaging.endpoints.AMFEndpoint"/>
    <properties>
        <polling-enabled>true</polling-enabled>
        <polling-interval-seconds>1</polling-interval-seconds>
    </properties>
</channel-definition>
このチャネル定義はインターバルが1秒のポーリングチャネルを定義しています。そのため、このクライアントはサーバに1秒ごとにポーリングメッセージを送ります。ポーリングチャネルはクライアントが変更通知を受けるもっとも簡単な方法です。他の選択肢としては、piggybacking を用いたポーリング、long-polling、streaming があります。

以下の Flex クライアントアプリケーションはメッセージの送信に Producer コンポーネントを、受信に Consumer コンポーネントを使用しています。メッセージを送信するために Producer はまず AsyncMessage クラスのインスタンスを作成してその body 要素にメッセージをセットします。そして Producer.send() メソッドによって送信します。メッセージを受信するためには、Consumer はまず Consumer.subscribe() メソッドにより特定の destination に対して送信されるメッセージに対するサブスクライブをします。
<?xml version="1.0"?>
<!-- intro\intro_messaging.mxml --> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="100%" height="100%"
    creationComplete="consumer.subscribe();">

    <mx:Script>
        <![CDATA[
            import mx.messaging.events.MessageFaultEvent;
            import mx.messaging.events.MessageEvent;
            import mx.messaging.messages.AsyncMessage;
            import mx.messaging.Producer;
            import mx.messaging.Consumer;

            // Send the message in response to a Button click.
            private function sendMessage():void {
                var msg:AsyncMessage = new AsyncMessage();
                msg.body = "Foo";
                producer.send(msg);
            }
            
            // Handle the received message.
            private function messageHandler(event:MessageEvent):void {
                ta.text += "Consumer received message: "+ event.message.body + "\n";
            }

            // Handle a message fault.
            private function faultHandler(event:MessageFaultEvent):void {
                ta.text += "Received fault: " + event.faultString + "\n";
            }
        ]]>
    </mx:Script>

    <mx:Producer id="producer"
        destination="MessagingDestination"
        fault="faultHandler(event);"/>

    <mx:Consumer id="consumer"
        destination="MessagingDestination"
        fault="faultHandler(event);"
        message="messageHandler(event);"/>

    <mx:Button label="Send" click="sendMessage();"/>
    <mx:TextArea id="ta" width="100%" height="100%"/>
</mx:Application>
Flash Builder か mxmlc コンパイラを使用してクライアントアプリケーションを SWF ファイルにコンパイルし、Webアプリケーションにデプロイします。

0 件のコメント:

コメントを投稿