Пишем Flex приложение с BlazeDS, Jboss и JMS

    Я как и многие веб-разработчики краем уха слышал о Flex, которая по сути — тот же Flash и swf-файл, но в сути не разбирался. Недавно узнал об интересных возможностях передачи сообщений от сервера клиенту, известной как server push. Это значит что можно обходиться без периодических ajax-запросов, а обновлять данные в режиме реального времени (отсюда возникает понятие потока), например для чата. Я постараюсь описать создание и архитектуру приложения = браузер / Flex / JBoss / BlazeDS / JMS, откуда уже информация может идти в (Spring / Hibernate / Mysql) и обратно.



    Flex или Flash?

    Если Flash ориентирован сильно на векторную графику, то Flex ориентирован на интерфейсы. Конечно можно создать интерфейсы во Flash и многие этим занимались раньше, разбирались в Action script, работали с xml, но Flex в этой области легче потому что ориентируется именно на интерфейсных приложениях, которые более мультимедийны чем просто javascript с его фреймворкамиКогда-то я спорил что HTML можно считать языком программирования, совершенно осознавая что в нём нет переменных, функций и вообще это по сути XML. Причём аргументировал я это тем что в принципе программа в широком понимании это последовательность действий и что угодно можно считать таковой — меню в баре, расписание автобуса.«Язык» Flex это XML, который может включать в себя ActionScript. Язык по сути открытый (opensource) и компилируется из mxml в swf при помощи одноимённого компилятора mxmlc. Для более удобной разработки есть платная IDE как Eclipse-расширение — Adobe Flex Builder 3, позволяющая быстро компилировать и открывать приложение с публикованием на серверы с технологиями J2EE/PHP/.NET либо в качестве независимого desktop'ного AIR-приложения. Flash/Flex методы можно связать с javascript, это позволяет переписывать только часть приложения при модернизации.

    Настройка Jboss

    Ставим последнюю стабильную версию Jboss сервера версии 4.2. Для этого просто перетаскиваем из скачанного архива папку jboss в Program Files. Jboss можно сравнить с Apache-сервером, но он по существу больше и за web-обработку отвечает только его часть — популярный Tomcat сервер для Java-приложений. Как вы уже догадались, серверное приложение будет не на php, а на java.В отличие от apache, jboss/tomcat сервер сразу делит работающие приложения на папки-программы, за пределы которых ничего не выходит. Согласно обучающей спецификации, папка с приложениями находится в jboss/server/default/deploy. Идём туда и создаём свою папку, скажем myflex.war (при этом .war обязательно)

    Flex клиент

    Вместо Flex SDK c mxmlc компилятор, я установил более наглядный IDE Adobe Flex builder 3 с триальным периодом. При wizard-добавлении нового проекта надо убрать LiveCycle и указать на папку myflex.war.Теперь пишем собственно код в смешанном mxml и action-script виде (см. внизу приложения). Главная часть кода — передача асинхронных сообщений. Для этого создаются объекты получателя и отправителя.producer = new Producer();
    producer.destination = "myTopic";
    producer.addEventListener(MessageAckEvent.ACKNOWLEDGE, acknowledgeHandler);
    producer.addEventListener(MessageFaultEvent.FAULT, faultHandler);

    consumer = new Consumer();
    consumer.destination = "myTopic";
    consumer.addEventListener(MessageAckEvent.ACKNOWLEDGE, acknowledgeHandler);
    consumer.addEventListener(MessageFaultEvent.FAULT, faultHandler);
    consumer.addEventListener(MessageEvent.MESSAGE, messageHandler);
    Изучать Flex можно начать с Developer Center.

    BlazeDS и служба сообщений (JMS)

    Скачиваем BlazeDS binary distribution. Это скомпилированная java-библиотека, которая позволит перенаправить сообщения из Flex на JMS, который стоитна Jboss сервере. Внутри скачанного архива откройте с помощью Winrar файлblazeds.war и распакуйте папку WEB-INF в наше приложение myflex.war


    Проверка

    Проверим что сервер работает. Создадим в приложениитестовый файл text.html с произвольным содержанием и запускаем jboss из файлаbin/run.bat. Запускается сервер полминуты, после чего можно открытьhttp://localhost:8080/myflex/test.html и убедится что банальная работа а-ля апач есть. Теперь при добавлении проекта, Flex Builder будет гореть зелёненьким подтверждая доступность по http.

    Настройка

    Теперь надо настроить перенаправление сообщений.
    Для этого понадобится изменить пять конфиг-файлов:
    1. jboss/server/default/deploy/jms/jbossmq-destinations-service.xml

      Этот файл отвечает за действующие «темы сообщений» JMS по умолчанию. За каждую тему отвечает свой класс (mbean), который в зависимости от версии jBoss наследует другой класс — org.jboss.jms.server.destination.TopicService для 5 версииили org.jboss.mq.server.jmx.Topic для 4.2.3 версии.

      Создаём новую тему с id=myJmsTopic
    2. jboss/server/default/deploy/myflex.war/WEB-INF/flex/services-config.xml

      Основной конфиг BlazeDS, который инклудит остальные три файла. Создаём новый класс канала с id=my-streaming-http, он наследует mx.messaging.channels.StreamingHTTPChannel.

      Всего каналы делятся по форматам (HTTP/AMF/RTMP), типам протокола (pooling / streaming) и уровню безопасности. Сообщение от flex-приложение поступает брокеру.
    3. jboss/server/default/deploy/myflex.war/WEB-INF/flex/messaging-config.xml

      Создаём направление (destination) c id=myTopic
    В остальных двух файлах proxy-config.xml и remoting-config.xml достаточно сменить канал по умолчанию с my-amf на my-streaming-http. Эти файлы отвечают за вызов java-методов обычным http-запросом (RPC).

    Компиляция

    На данный момент если вы сделаете компиляцию mxml, Flex Builder возьмёт откуда-то из своей папки написанный вами код и выложит swf в папку Jboss, откроет браузер где вы вероятно всего получите в браузере ошибку от flash:[MessagingError message='Destination 'myTopic' either does not exist or the destination has no channels defined (and the application does not define any default channels.)']Всё дело в том, что при компиляции конфиг-файлы ещё не учитываются — ведь они лежат отдельно от flex-проекта среди BlazeDS. Для этого идём в настройки flex-проекта и добавляем под Flex Compiler дополнительные аргументы с полным путём:
    -services «C:\Program Files\jboss\server\default\deploy\myflex.war\WEB-INF\flex\services-config.xml»

    Дебаг

    После успешной компиляции я всё-равно получил внутреннюю ошибку, на которую был обработчик. Однако до её деталей хотелось добраться, поэтому в Flex Builder'е есть приятная возможность дебага.Достаточно перейти в режим другой перспективы (все с Eclipse знакомы?), поставить на нужном месте кода breakpoint и при исполнении всё словится.Так второй частой ошибкой становится использование {context-root} в настройках endpoint, из-за чего нельзя достучаться до брокера, ведь он должен быть доступен в http://localhost:8080/myflex/messagebroker/streaminghttp. Это решается тоже в настройках проекта Flex IDE.Третьей ошибкой становится кэширование браузером swf-файла, из-за чего не видно обновления.

    А дальше?

    Как я уже сказал, cообщения напрямую через BlazeDS идут в JMS. JMS по сути работает как почтовый ящик, в который сообщения попадают по каналам от producer к одному или нескольким consumer'ам, при этом существуют два типа «тем» по алгоритму раздачи сообщений — topic и queue. С JMS в свою очередь легко связаться из обычного консольного/UI java-приложения.Читайте также:Оригинал →

    Комментарии 5

      –1
      хабракат…
        0
        Спасибо, я о всех этих технологиях и не знал (кроме Флекса). Наверное, потому что не по профилю ). В любом случае, буду иметь в виду.
        Осведомлен — значит вооружен.
        • НЛО прилетело и опубликовало эту надпись здесь
          • НЛО прилетело и опубликовало эту надпись здесь
            0
            Было бы очень интересно посмотреть на пример использования action script (а не flex) в связке с BlazeDS. Сам уже голову сломал — не могу заставить адекватно работать.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое