nod::ぶろぐ:RIA::Flex/AIR/Flash

FlashやFlex,(Ajax),S2Flex2,ActionScript3,yui-frameworks,Akabanaプロジェクトなどのメモ帳

Flex2でOpenAMFに接続してみる。(1)失敗編

というわけで、こちらのエントリーで紹介しましたように、Flex2AMFPHPに接続できているとのことなので、OpenAMFで接続できるかどうかの検証をはじめてみました。

まずは失敗編から。

まずは、元になったエントリーでの方法を無視して<mx:RemoteObject>タグで何とかしてみようとしました。

用意したもの

  • Eclipse3.1(Flex Builder 2 plugin)
  • tomcat5.5
  • OpenAMF(exampleのファイル)

最初にEclipse上にtomcatプロジェクトを作ってOpenAMFのサンプルを起動できるようにしました。それからFlex2での動作検証をする為の準備をします。

1.Channelの追加

RetemoObjectタグでOpenAMFに接続できるように、flex-services.xmlにchannelの設定を追加します。
<channel-definition id="open-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://localhost:8080/openamf/gateway" port="8080" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<serialization>
<custom-deserializer type="typed-object" class="flex.messaging.io.amf.serializers.TypedObjectDeserializer" />
<custom-serializer type="typed-object" class="flex.messaging.io.amf.serializers.TypedObjectSerializer"/>
</serialization>
</properties>
</channel-definition>

URIとPort,id以外は、これまでの設定と同じものにしました。
接続先さえOpenAMFになれば、その他の設定は使われないであろうという予想です。(根拠なし)

2.サービスの設定

channelの追加が終わったらそのchannelを利用するサービスを追加します。 サービスはOpenAMFのサンプルで使われているものをそのまま利用してみました。
<destination id="TestBean">
<properties>
<source>org.openamf.examples.TestBean</source>
<service-name>TestBean</service-name>
</properties>
<channels>
<channel ref="open-amf"/>
</channels>
</destination>

ポイントはchannel refで1で追加したopenAMFのchannelを指定することです。
それ以外は、どう影響するかまだわかっていません。

3.mxmlに記述

ここまできてやっとmxmlに記述して検証開始です。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2005/mxml" xmlns="*">
<mx:Script>
import mx.rpc.events.ResultEvent;
import mx.utils.ObjectUtil;
import mx.rpc.remoting.mxml.RemoteObject;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;

public function CallResult(event:Event)
{
resultDump.text = mx.utils.ObjectUtil.toString( ResultEvent(event).result );
}
public function getValue(){
flash.net.NetConnection.defaultObjectEncoding=ObjectEncoding.AMF0;
test.getTestValue();
}
public function setValue(){
flash.net.NetConnection.defaultObjectEncoding=ObjectEncoding.AMF0;

test.setTestValue(inp.text);
}
</mx:Script>
<mx:RemoteObject
id="test"
destination="TestBean"
result="CallResult(event)" >
</mx:RemoteObject>
<mx:Panel label="Operations" height="100%" width="20%" >
<mx:TextInput id="inp" width="100" />
<mx:Button label="setValue" width="100" click="setValue();"/>
<mx:Button label="getValue" width="100" click="getValue();"/>
</mx:Panel>
<mx:Panel label="Rsults" height="100%" width="80%" x="162" y="2">
<mx:TextArea id="resultDump" height="50%" width="50%" text="results:"/>
</mx:Panel>
</mx:Application>

ただRemoteObjectを呼び出すだけだとAMFのversionが3になるのでOpenAMF側ではでエラーになります。

そこで上記のようにRemoteObjectのメソッドを呼び出す前にNetConnectionのデフォルトエンコーディングを設定して実行するようにしました。

flash.net.NetConnection.defaultObjectEncoding=ObjectEncoding.AMF0;

そうするとOpenAMF側でのログが変化しました。AMFのversionは0になり設定が反映されていることがわかります。
しかし、呼び出すクラスやメソッドがうまく渡っていないのでやっぱりエラーになります。


OpenAMFのサンプルから呼び出したときのログ

[AMFMessage: {version=0, headers={[AMFHeader: {key=amf_server_debug, required=true, value=ASObject[type=NetDebugConfig]}]}, bodies={[AMFBody: {serviceName=org.openamf.examples.TestBean, serviceMethodName=setTestValue, response=/1, type=ARRAY, value=[test]}]}}]

Flex2から呼び出したときのログ

[AMFMessage: {version=0, headers={}, bodies={[AMFBody: {serviceName=null,serviceMethodName=null, response=/1, type=ARRAY, value=[ASObject[type=flex.messaging.messages.CommandMessage]]}]}}]

GatewayServletまでは呼び出せるのですが
ServiceNameとserviceMethodNameがnullになっているので、その後のJavaクラスを呼び出せませんでした。

RemoteObjectタグとflex-services.xmlとAS3どこで指定すればいいのかいまのところわかりません。
あともう少しだと思ったのになぁ..

この検証でわかったこと。

  • flex-services.xmlでchannelを指定すればOpenAMFに接続することができる
  • RemoteObjectタグで指定したときもAMF0で接続することができる。

わからなかったこと

  • RemoteObjectタグでAMF version 0のServiceNameとserviceMethodNameを渡す方法
  • RemoteObjectタグを利用してOpenAMFとうまく連携させる方法


OpenAMF
http://www.openamf.org

Flex2でJavaのRemoteObjectにアクセスしてみる(2)
http://www.noridon.net/weblogs/archives/2005/11/flex2javaremote_1.html

Posted by nod at 2006年01月08日 13:19 | コメント (0) | トラックバック (0) | Clip!! | Clip!! | このエントリーを含むはてなブックマーク |digg it! |del.icio.us it!

この記事に対するコメント

この記事に対するコメントはまだありません。


コメントを投稿する




保存しますか?



この記事のトラックバックURL


この記事に対するトラックバック

この記事に対するトラックバックはまだありません。



Flex.org - The Directory for Flex Get Adobe Flash Player Made with dreamweaverMade with fireworksPowered by Movable Type 3.36Powered by Wandering Wind
Copyright : [Articles] (C) nod::ぶろぐ:RIA::Flex/AIR/Flash All Rights Reserved.
[Comments/Trackbacks] ... Authors of those have rights.