Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Котяра

Оценить эту запись

Тестирование Flex rpc и messaging классов в pure AS3 и BlazeDS

Запись от Котяра размещена 27.03.2009 в 17:44
Обновил(-а) Котяра 25.02.2010 в 09:54

Продолжаю тестировать BlazeDS.
NetConnection хорошо, но во Flex есть большое количество замечательных классов в пакетах
rpc и messaging.
Основной затык был " как использовать эти классы в чистом as3"
Гугление на протяжении нескольких часов и тестирование методом научного тыка помогли:
Представляю вам пример общения с удаленным объектом с сериализацией возвращаемого сервером класса.
Код 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);
		}
 
	}
}
класс User
Код AS3:
package  
{
	public class User 
	{
 
		public var id:int;
		public var name:String;
 
		public function User() 
		{
 
		}
 
		public function toString():String
		{
			var ret:String = "[id=" + String(id) + ", " + "name=" + name+"]";
			return ret;
 
		}
	}
 
}
Размещено в ru.k0t0vich
Комментарии 2 Отправить другу ссылку на эту запись
Всего комментариев 2

Комментарии

Старый 22.06.2010 19:11 NewMan_by вне форума
NewMan_by
 
Аватар для NewMan_by
Как раз возникла подобная потребность, а можешь выложить или выслать полную сборку примера, чтобы локально потестировать? Спасибо!
Старый 22.06.2010 19:19 Котяра вне форума
Котяра
 
Аватар для Котяра
AS сторона здесь полностью.
java - нет у меня исходника - давно дело было.
Но там всё просто - берешь blazeDS туториал любой по amfChannel и RemoteObject+ заводишь явовский класс flex.samples.hello.User.
Обновил(-а) Котяра 22.06.2010 в 19:21
 

 


Часовой пояс GMT +4, время: 21:31.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.