Тестирование Flex rpc и messaging классов в pure AS3 и BlazeDS
Продолжаю тестировать BlazeDS.
NetConnection хорошо, но во Flex есть большое количество замечательных классов в пакетах
rpc и messaging.
Основной затык был " как использовать эти классы в чистом as3"
Гугление на протяжении нескольких часов и тестирование методом научного тыка помогли:
Представляю вам пример общения с удаленным объектом с сериализацией возвращаемого сервером класса.
package { import flash.display.Sprite; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.messaging.ChannelSet; import mx.messaging.Channel; import mx.messaging.channels.AMFChannel; import mx.messaging.events.*; import mx.rpc.remoting.RemoteObject; import mx.core.mx_internal; import mx.messaging.config.LoaderConfig; import mx.logging.targets.TraceTarget; import mx.messaging.messages.*; import mx.messaging.config.ConfigMap; import mx.collections.ArrayList; import mx.collections.ArrayCollection; import mx.utils.ObjectProxy; import flash.net.registerClassAlias; import flash.events.Event; import flash.system.ApplicationDomain; import mx.core.Singleton; import mx.messaging.Consumer; /** * Тестирование Flex rpc и messaging классов в pure AS3 и BlazeDS * @author k0t0vich (c) 2009 b_konstantin@list.ru http://islandsworld.ru/ */ public class Main extends Sprite { public var consumer:Consumer; public var amfChannel:AMFChannel; public var channelSet:ChannelSet; public var ro:RemoteObject; public function Main():void { //Спасибо Peter Farland //http://www.adobeforums.com/webx/?13@618.wIQPiTpvUo4@.59b6384e/0 // Регистрируем удаленные классы используемые в инструкции [RemoteClass] во флекс классах registerClassAlias("flex.messaging.messages.CommandMessage",CommandMessage); registerClassAlias("flex.messaging.messages.RemotingMessage",RemotingMessage); registerClassAlias("flex.messaging.messages.AcknowledgeMessage", AcknowledgeMessage); registerClassAlias("flex.messaging.messages.ErrorMessage",ErrorMessage); registerClassAlias("DSC", CommandMessageExt); registerClassAlias("DSK", AcknowledgeMessageExt); registerClassAlias("flex.messaging.io.ArrayList", ArrayList); registerClassAlias("flex.messaging.config.ConfigMap",ConfigMap); registerClassAlias("flex.messaging.io.ArrayCollection",ArrayCollection); registerClassAlias("flex.messaging.io.ObjectProxy",ObjectProxy); registerClassAlias("flex.messaging.messages.HTTPMessage",HTTPRequestMessage); registerClassAlias("flex.messaging.messages.SOAPMessage",SOAPMessage); registerClassAlias("flex.messaging.messages.AsyncMessage",AsyncMessage); registerClassAlias("DSA", AsyncMessageExt); registerClassAlias("flex.messaging.messages.MessagePerformanceInfo", MessagePerformanceInfo); //Users // Регистрируем сериализованный пользовательский класс registerClassAlias("flex.samples.hello.User",User); // вот эти строчки нужны для регистрации флексовских классов var resourceManagerImpl:Object =ApplicationDomain.currentDomain.getDefinition("mx.resources::ResourceManagerImpl"); Singleton.registerClass("mx.resources::IResourceManager",Class(resourceManagerImpl)); if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point //Трайсер var target:TraceTarget = new TraceTarget(); target.level = 0; //Эти строчки нужны для доступа флексовских классов к root var swfURL:String = this.loaderInfo.url; LoaderConfig.mx_internal::_url = this.loaderInfo.url; LoaderConfig.mx_internal::_parameters = this.loaderInfo.parameters; //Определение каналов amfChannel= new AMFChannel("my-amf", "http://192.168.10.38:8080/samples/messagebroker/amf"); amfChannel.requestTimeout = 3; amfChannel.connectTimeout = 3; channelSet = new ChannelSet(); channelSet.addChannel( amfChannel ); amfChannel.addEventListener(ChannelFaultEvent.FAULT, handleChannelFault); amfChannel.addEventListener(ChannelEvent.CONNECT, handleChannelConnect); amfChannel.addEventListener(ChannelEvent.DISCONNECT, handleChannelDisconnect); //для чистого AS3 нужно использовать правильный RemoteObject в //import mx.rpc.remoting.RemoteObject; //а не в //import mx.rpc.remoting.mxml.RemoteObject; ro = new RemoteObject(); //ro.destination определяет идентификатор определения удаленного объекта в remoting-config.xml ro.destination = "hello"; ro.channelSet = channelSet; ro.addEventListener(ResultEvent.RESULT, onResult); ro.addEventListener(FaultEvent.FAULT, onFault); //Вызов метода класса определенного в destination ro.getOperation("hello").send("Piter2"); //также можно //ro.hello("Piter2"); } // Хэндлеры результатов, ошибок итп. private function onResult(e:ResultEvent):void { trace("RPC Ok"); var user:User = e.result as User; trace (user); } private function onFault(e:FaultEvent):void { trace("RPC Fail"); trace(e.message); } public function handleChannelFault(e:ChannelFaultEvent):void { trace("Channel Fault"); trace(e); } public function handleChannelConnect(e:ChannelEvent):void { trace("Channel Connect"); trace(e); } public function handleChannelDisconnect(e:ChannelEvent):void { trace("Channel Disconnect"); trace(e); } } }
Всего комментариев 2
Комментарии
![]() ![]() |
|
Как раз возникла подобная потребность, а можешь выложить или выслать полную сборку примера, чтобы локально потестировать? Спасибо!
|
![]() ![]() |
|
AS сторона здесь полностью.
java - нет у меня исходника - давно дело было. Но там всё просто - берешь blazeDS туториал любой по amfChannel и RemoteObject+ заводишь явовский класс flex.samples.hello.User. |
|
Обновил(-а) Котяра 22.06.2010 в 19:21
|
Последние записи от Котяра
- Страх и ненависть в Нью-Дели или сборка мультипака для arm7 и x86 c Adobe AIR 14 в FB (16.06.2014)
- Нативный EventDispatcher в старлинге (27.11.2013)
- Нужны ошибки компиляции при создании экземпляра синглетона извне? Запросто! (13.09.2013)
- ARP - новый формат упаковки ресурсов (07.02.2013)
- DropShadowFilter и GlowFilter в Starling (16.01.2013)