Пишем 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 с его фреймворками. В качестве примера Flex-приложения можно посмотреть TextFlow - синхронный многопользовательский редактор статей.

Когда-то я спорил что HTML можно считать языком программирования, совершенно осознавая что в нём нет переменных, функций и вообще это по сути XML. Причём аргументировал я это тем что в принципе программа в широком понимании это последовательность действий и что угодно можно считать таковой - меню в баре, расписание автобуса.

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

Flash-платформа

Настройка Jboss

Ставим последнюю стабильную версию Jboss сервера версии 4.2. Для этого просто перетаскиваем из скачанного архива папку jboss в Program Files. Jboss можно сравнить с Apache-сервером, но он по существу больше и за web-обработку отвечает только его часть - популярный Tomcat сервер для Java-приложений. Как вы уже догадались, серверное приложение будет не на php, а на java.

jboss.png

В отличие от 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).

Настройка дополнительных параметров в Flex builder

Компиляция

На данный момент если вы сделаете компиляцию 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-файла, из-за чего не видно обновления.

Дебаг в Flex builder

А дальше?

Как я уже сказал, cообщения напрямую через BlazeDS идут в JMS.  JMS по сути работает как почтовый ящик, в который сообщения попадают по каналам от producer к одному или нескольким consumer'ам, при этом существуют два типа "тем" по алгоритму раздачи сообщений - topic и queue.

С JMS в свою очередь легко связаться из обычного консольного/UI java-приложения. Читайте продолжение в статье о JMS-клиенте.

Читайте также:

RSS

Комментарии

  • Было б классно посмотреть на то, что у тя получилось в итоге. Хотя б скринкаст, что ли ))