というわけで、こちらのエントリーで紹介しましたように、Flex2でAMFPHPに接続できているとのことなので、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
この記事に対するコメント