s2blazeds の利用 ハマったところ①

AIRでは、services-config.xmlのURLはリテラルで記述すること。

参考:http://d.hatena.ne.jp/Asarima/20081016/p1

■[AIR]BlazeDSのAMFチャネルのエンドポイントを記述する
BlazeDS turnkeyを使って AIR アプリケーションから Java オブジェクトのメソッド呼び出しに挑戦するが、なぜか以下のエラーで送信に失敗してしまう。

[RPC Fault faultString="送信できませんでした" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Failed: url: 'http://rrSample.swf/blazeds/messagebroker/amf'"]
at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:218]
at mx.rpc::Responder/fault()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:53]
at mx.rpc::AsyncRequest/fault()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:103]
at mx.messaging::ChannelSet/faultPendingSends()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1482]
at mx.messaging::ChannelSet/channelFaultHandler()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:975]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.messaging::Channel/connectFailed()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\messaging\Channel.as:997]
at mx.messaging.channels::PollingChannel/connectFailed()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\messaging\channels\PollingChannel.as:354]
at mx.messaging.channels::AMFChannel/statusHandler()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:390]


デバッガで追ってみると、services-config.xml に定義している my-amf チャネルの endpoint が以下のようになっていて、server.name, server.port トークンを置き換えた結果おかしくなることを突き止めた。その証拠にリテラルlocalhost:8400 と上書きしてみると通信がうまくいった。




なぜトークンの置き換えに失敗するのか調べてみると、BlazeDS ではないものの LifeCycle DS の資料で以下の記述を発見した。AIRではだめみたい。

チャンネル設定のエンドポイント URL での実行時のトークン置き換え(server.name や server.port など)は、AIR アプリケーションでは機能しません。AIR アプリケーションに対応する宛先は、トークンを含むチャンネルでは設定せず、代わりにリテラル URL の値を使用してください。

Adobe LiveCycle Data Services ES 2.6 リリースノート
というわけで、エンドポイントの server.name, server.port は記述しましょう。services-config.xml を変更したら、turnkey(tomcat)の再起動を忘れずに、AIR アプリケーションの再コンパイルもやったほうがいいみたい。