Технология BlazeDS, которая все чаще будет ассоциироваться со словами "Remoting" и "Messaging", вошла в свою предрелизную фазу. Напомню, BlazeDS — это Java-Flex фреймворк для обмена данными, командами и сообщениями между клиентом и сервером с высокой производительностью. У Кристофа Конраца есть интересные замечания об этой технологии. И, кстати, уже открыт сайт BlazeDS — полка совсем пустой.
Adobe отдала BlazeDS в Open Source и призывает разработчиков портировать ее на популярные платформы, для чего пригодится спецификация формата сообщений AMF (см. внизу). Качаю новую версию, пробую в действии.
Update 1: Когда скачаете архив с BlazeDS, обратите внимание на каталог с пустым именем (!) внутри архива. Так это выглядит в Total Commander. Не пытайтесь распаковать этот "каталог" и читайте дальше.
Update 2: Это не каталог с пустым именем. На самом деле, внутри архива есть файл с именем "\blazeds-turnkey-readme.htm". Обратный слэш в имени файла — это вообще недопустимый символ. Увидеть его удалось через WinRar, а также при попытке переименования файла в Total'е. Однако, кто-то сумел вписать слэш в имя файла. В результате, в Total Commander вы увидите внутри архива лишний "каталог" с именем "[]" — да, именно пустая строка. Игнорируйте его. Кстати, Windows Explorer вообще не отображает ни файла с "битым" именем, ни "каталога" и не распаковывает этот файл. Используйте Total Commander, он распаковал все (но не трогайте "каталог []").
Update 3: для описанного бага создан багрепорт в Adobe JIRA. За него можно голосовать — быстрее пофиксят.
Update 4: Ошибка дистрибутива BlazeDS обработана в Adobe за 9 рабочих дней.
Продолжая экспериментировать с производительностью Flash Remoting во Flash Player 9, я попробовал избавиться от класа Point, используемого для описания элементарной точки в массиве координат. Я предположил, что на описание типа данных расходуется значительная часть трафика, а когда точек действительно много, то можно попытаться сэкономить трафик, заменив массив с объектами типа Point массивом с простым набором чисел, где координаты x и y просто попеременно идут друг за другом.
Point
x
y
Эффект от детипизации был не слишком высокий: вместо 19 Кб данные стали весить 18 Кб (для 4000 точек). Вопрос экономии на типах данных во Flash Remoting практически закрыт: похоже, здесь много не выиграешь. Хотя стоит проверить это еще раз — на огромных массивах.
Мне выпал шанс грубо сравнить производительность Flash Remoting во Flash Player 9 с передачей XML-данных. Рабочие условия: есть гео-данные в формате GML (XML), описывающие границы районов города в виде полигонов. Общее количество точек-вершин полигонов — около 4000. Размер загружаемого XML равен 244 Кб, а со стандартным GZIP-сжатием — 49 Кб. Требуется сократить размер загружаемых данных и время их загрузки.
С использованием Flash Remoting размер загружаемых данных составил 44 Кб, а с GZIP-сжатием — 19 Кб. Это в 2,5 раза меньше размера XML, приблизительно настолько же быстрее оказалась и загрузка Remoting-данных. Кроме того, за счет обмена в Remoting типизированными геометрическими объектами удалось избавиться от некоторых шагов по разбору гео-данных из XML, так что выросла и скорость отрисовки загруженных полигонов.
Но у Flash Remoting, похоже, есть свой минус. Загруженные данные не кэшируются между сессиями, поскольку работа Remoting идет через POST-запросы. Думаю о создании своего кэша во Flash Cookies, но он ведь тоже не резиновый, а объем данных весьма большой. Может, есть другие варианты?
Вы любите Flash Remoting во Flash? Используете его простоту и скорость? Тогда вы наверняка заметили, что для Flash CS3 набора Remoting Components нет и не предвидится. Почему, я не знаю; зато знаю, как его вернуть. Оказывается, во Flash CS3 никакие специальные компоненты для ремоутинга вообще не нужны. Достаточно правильно использовать AS3-класс NetConnection, как подсказывает Оскар Трельес: создаем класс-обертку вокруг NetConnection и называем его RemotingService. В нем задаем кодировку ремоутинга (AMF0/AMF3) и устанавливаем соединение. Работает хоть с AMFPHP, хоть с Fluorine под .NET.
NetConnection
RemotingService
Далее - код, пример использования и одна проблема, с которой я столкнулся.
package { import flash.net.NetConnection; import flash.net.ObjectEncoding; public class RemotingService extends NetConnection { function RemotingService(url:String) { // Set AMF version objectEncoding=ObjectEncoding.AMF3; // Connect to gateway connect(url); } } }
package { import flash.net.Responder; public class RemotingGateway { private var gatewayURL:String; private var rs:RemotingService; function RemotingGateway(strServicePath:String = null) { trace("Init remoting, path = " + strServicePath); init(strServicePath); } private function init(strServicePath:String = null) { gatewayURL = strServicePath; rs=new RemotingService(gatewayURL); } public function testRemoting():void { var responder:Responder=new Responder(onResult,onFault); rs.call("Web.Services.FlashProxy.Test",responder, {array:new Array(0,1,2)}); } private function onResult(result:Object):void { trace("Remoting Result: " + result); } private function onFault(fault:Object):void { trace ( "Remoting fault type:\t" + fault.type + "\nFault code:\t" + fault.code + "\nFault level:\t" + fault.level + "\nDescription:\n\t" + fault.description + "\nDetails:\n\t" + fault.details ); } } }
var remotingGateway:RemotingGateway = new RemotingGateway("URL — ПУТЬ К СЕРВИСУ"); remotingGateway.testRemoting();
Работает!
rs.call("Web.Services.FlashProxy.Test",responder, {array:new Array(0,1,2)})
{array:new Array(0,1,2)}
rs.call("Web.Services.FlashProxy.Test",responder, 0, 1, 2)
Could not find a suitable method with name Test. Details: at com.TheSilentGroup.Fluorine.MethodHandler.GetMethod(IApplicationContext applicationContext, Type type, String methodName, IList arguments) at com.TheSilentGroup.Fluorine.Filter.LibraryAdapter.Invoke(IApplicationContext applicationContext, AMFBody amfBody)
at com.TheSilentGroup.Fluorine.Filter.LibraryAdapter.Invoke(IApplicationContext applicationContext, AMFBody amfBody)
Ошибка выдается, хотя серверный метод ждет несколько чисел, а не одну переменную.
В чем причина такого поеведения? Может, я что-то делаю не так? Не та версия ремоутинга? Бьюсь второй день.
UPD: Похоже, мне удалось обойти проблему, используя AMF0 в настройке класса RemotingService: objectEncoding=ObjectEncoding.AMF0;. Но ведь Fluorine умеет работать с более производительным AMF3! Как склонить его к нормальной работе с AMF3?
objectEncoding=ObjectEncoding.AMF0;
Короткий ответ — никак. Во Flash9 остался старый компонент WebServicesConnector и класс WebService (pdf), работающие только для из ActionScript2.0. Для AS3 Data Binding не реализован, поэтому нет и соотвествующего компонента, что очень странно. В документации (по ссылке выше) кодеру предлагается самостоятельно разбирать данные от веб сервисов. И некоторые уже так и сделали: пример класса WebService для Flash9 (см. пост от Tesseract).
Арала Балкана заставили (или он сам того захотел) выдать порцию инфы о его новом проекте, The Tangent.
Что такое Тангент?
Как пишет Арал, Тангент -- это результат его тотального недовольства существующими технологиями поставки данных во флэш-приложения, которые, по словам Арала, не дают флэш-разработчикам по-настоящему развернуться на поприще экспериментов с разными поставщиками данных. Даже Flash Remoting. Флэш-алхимикам связали руки и забрали хрустальные шарики, и вот Арал эти руки обещает развязать и шарики вернуть.
Что же именно он обещает?
- Простоту (это было, но он хорошо знает, что это было, и за слова вроде отвечает; пишет: Тангент будет самым легким способом работы с данными из Flash). Простота касается всех аспектов -- разработки, установки, документации и поддержки.
- Поддержку PHP на сервере в первой версии, с последующим расширением до поддержки Python, Ruby и Java.
- Компонент Analyzer -- часть проекта. Что он делает? Похоже, что-то анализирует...
- Никаких огромных библиотек кода.
- Безопасность.
- Совместимость с существующими технологиями работы с данными (remoting etc.)
- Флэш-разработчикам понравится (что же он там такого делает?).
Проект выходит сегодня-завтра-на-днях -- следите за Аралом.
Fluorine является лучшим решением для Flash Remoting под .NET -- это вы знаете.
А чтобы было легче запускать новые Remoting-приложения на базе Fluorine, выпущен инсталлятор Fluorine.
За что его любить: * Устанавливает исходный код Fluorine, DLL для дебага и проекта (.NET версии 1.1) * Регистрирует Fluorine DLL в реесте сборки .NET (это означает, что он отобразится в диалоге "Add Reference" Visual Studio) * Файл помощи (chm) * Мастер Fluorine (шаблоны проектов) для Visual Studio (новый тип приложения в диалоге "New Project" Visual Studio)
Мастер доступен в Visual Studio 2003 и 2005, для VB.NET и C# ("Express" версии не поддерживаются). Генерирует "Fluorine-ready"-приложение.
Если вы откроете и перекомпилируете файл проекта по умолчанию (см. в каталоге "source"), код вашего приложения может дебажиться (функции Debug и Step) в коде Fluorine.
Для установки нужны права администратора.
Читайте также: Fluorine Projector и туториал по Flash Remoting: Fluorine.
// Информация из Fluorine mailing list
Remoting-технология SabreAMF 0.2 находится в работающей бете и поддерживает Flex 2 AMF3.
Возможности включают поддержку сообщений flex 2 и класс CallbackServer.
Качать SabreAMF 0.2 и начинать использовать AMF3 с PHP!
Fluorine -- незаменимое бесплатное (и с открытым кодом) решение при использовании .NET в качестве серверной части Flash Remoting-приложений. Закономерно, что теперь и для него есть свой туториал: введение во Flash Remoting на базе Fluorine. (На самом деле даже странно, что этот туториал появился только недавно).
А не так давно появилось новое решение типа swf2exe: Fluorine Projector, основанное, как видно из названия, на самом Fluorine. Это тоже бесплатно и тоже с открытым кодом. Короткая обучалка по использованию Fluorine Projector находится по последней ссылке (там же можно сразу его скачать).
Flash Remoting шагает в сторону Ruby. Или наоборот -- но какая разница? Главное -- есть люди, которые их сближают. Вот Макс Лапшин сделал парсер amf пакетов на Ruby on Rails, написанный по спецификации amf с сайта osflash.org.
Любой желающий может забрать исходные файлы amf-парсера по указанной ссылке.
Говорит сам Макс:
"Он не сильно что бы хорошо оформлен и фреймворка вокруг этого нет. Но пакеты читать и писать умеет. Core data читается и пишется, кажется, целиком. Data types -- там есть еще чего обсуждать. В частности, не готовы RecordSet-ы."
Core data читается и пишется, кажется, целиком. Data types -- там есть еще чего обсуждать. В частности, не готовы RecordSet-ы."
Вот дочитаю книжку по флексу, затем дочитаю книжку про руби, и займусь этим. Впрочем, если кто-то опередит, мне будет совсем не обидно, правда ;)
Чтобы передать XML-объект на сервер при помощи Flash Remoting, не нужно предварительно превращать его в строку. Нужно взять и просто передать серверному методу этот XML -- а этот "принимающий" метод на сервере тоже должен ожидать именно XML объект, и это работает в разы быстрее, чем попытка передать XML как строку. Вот в чем ремотинг-чудо-то!
Совсем древнее: 17-20.09.2002, 23-30.09.2002, 01-04.10.2002, 07-11.10.2002, 14-19.10.2002, 20-26.10.2002, 27.10-02.11.2002, 04-08.11.2002, 11-16.11.2002, 18-23.11.2002 25-30.11.2002, 02-07.12.2002, 09-14.12.2002 Сайт заработал 17.09.2002