Статьи

Создание прототипа корпоративного веб-приложения в Devoxx Hackergarten

10-й год подряд я посещал DevoxxBe . Это моя любимая конференция по Java, но график разговоров не всегда оптимален: иногда я хочу увидеть 2 отличных выступления одновременно! Так, в Хакергартене в Devoxx, между посещением переговоров, некоторые из нас начали создавать веб-приложение для улучшения графика. Мы называем прототип OptaConf, и он находится под лицензией Apache.

Последние 4 года я работаю в своем уголке мира (OptaPlanner, Drools и т. Д.), Поэтому мой опыт работы с другими корпоративными технологиями Java (JEE) становится немного устаревшим. Презентации (например, в Devoxx) позволяют мне оставаться на связи с постоянно меняющимся корпоративным миром Java, но ничто не сравнится с получением личного опыта написания реалистичного веб-приложения.

Я написал бэкэнд. Интерфейс был любезно предоставлен другими посетителями Хакергартена: Икшелем, Дэвидом, Анной Марией, Селестино и Федерико. Особая благодарность организатору Хакергартена Андресу за то, что он собрал нас вместе и других участников Хакергартена (иногда руководит проектом по конкретной технологии), чтобы помочь нам преодолеть подводные камни.

Backend

Написание бэкэнда оказалось легким делом с использованием технологий JEE 7:

  • Простой Java для моделирования классов домена , таких как Speaker , Room и т. Д.
  • JAXRS для предоставления службы REST для предоставления данных в веб-интерфейс.
    • Это было буквально так же просто, как добавить несколько аннотаций ( @GET , @Path , …) и короткую запись в web.xml . Brilliant.
    • Для получения дополнительной информации см. Документацию RESTEasy .
  • JsonReader для импорта данных переговоров из API Devoxx CFP, который затем преобразуется в классы нашего домена.
    • Я не использовал JAXRS для чтения этого потока REST, потому что JsonReader предоставляет мне DOM-подход к данным, который я затем напрямую сопоставляю с нашими классами домена, без необходимости моделировать их класс домена (которые нам больше не нужны) ,
    • Спасибо Аруну и образцам JEE 7 за то, что они указали мне направление, подходящее для этой работы.
  • OptaPlanner для оптимизации графика
    • Это также было очень легко для меня!
    • Для получения дополнительной информации см. Документацию OptaPlanner .
  • CDI, чтобы склеить все это вместе
    • Это было немного сложнее: хотя первоначальный @Inject работал хорошо, использование производителя для предоставления фиктивных тестовых данных (до того, как был написан импорт Devoxx CFP) заставило меня остановиться на нескольких ловушках:
      • Есть две аннотации с именем @Produces и я автоматически импортировал неправильную.
      • У меня была неоднозначная зависимость между производителем и исходным объектом, поэтому мне пришлось прибегнуть к добавлению @Vetoed к исходному объекту…
    • Для получения дополнительной информации см . Документацию Weld .
  • WildFly 8 для развертывания веб-приложения.
    • Это так быстро, это потрясающе. Запуск и развертывание нашего веб-приложения займет около 3 секунд.
    • Плагин maven-wildfly-plugin для развертывания веб-приложения из командной строки:
    • IntelliJ для развертывания взорванного веб-приложения прямо из моей IDE
    • Для получения дополнительной информации см. Веб-сайт WildFly .
  • JPA Hibernate для сохранения данных
    • Это еще не было реализовано. По истечении вашего сеанса (через 30 минут) ваши данные в настоящее время теряются.

В общем, это хорошо сработалось. Менее чем за 1 день работы я смог реализовать весь бэкэнд: импортировать Devoxx, оптимизировать его и представить как сервис REST. Конечно, помогли эксперты, чтобы немедленно решить подводные камни.

Что мне действительно понравилось, так это конфигурация pom.xml . Это целое дерево зависимостей, чтобы все эти технологии были доступны:

01
02
03
04
05
06
07
08
09
10
11
12
13
<dependencies>
  <dependency>
    <groupId>org.optaplanner</groupId>
    <artifactId>optaplanner-core</artifactId>
    <version>6.2.0.CR1</version>
  </dependency>
  <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

Внешний интерфейс

Я не работал над внешним интерфейсом, поэтому трудно комментировать (но это не остановит меня). У нас было 3 воплощения. Все использовали AngularJS, некоторые с беседкой и прочее. Лично я чувствую, что все технологии веб-интерфейса неуклюжи: каждый год появляется новая реклама, и мы все должны перейти на нее. Некоторые (например, Флекс) перешли от шумихи к смерти менее чем за год.

Как бы то ни было, в стороне от всего этого, ребята из внешнего интерфейса проделали отличную работу, особенно вклад Селестино очень хорошо визуализировал расписание:

До: оригинальное расписание Devoxx 2014

optaconfPocDevoxxScheduleBefore

Выше оригинальное расписание Devoxx 2014 для среды. Каждый трек (представляющий собой набор связанных выступлений) имеет свой цвет фона.

Обратите внимание, что в первом временном интервале одновременно происходит две беседы в Web и HTML5 (фиолетовые). А во втором временном интервале одновременно идут два разговора о облаке и BigData (коричневые). И нет никаких методологических переговоров (зеленый) в среду! Это означает, что переговоры по методологии почти неизбежны в четверг … о, ужас!

После: POC оптимизировал график Devoxx 2014

optaconfPocDevoxxScheduleAfter

Выше график после того, как он оптимизирован с OptaPlanner для среды. Обратите внимание, как теперь я могу смотреть все разговоры целого трека, не пропуская ни одного. Эта оптимизация уже учитывает конфликты докладчиков.

Дополнительные ограничения должны легко добавляться, такие как:

  • Популярные разговоры получают больше комнаты
  • Отслеживание стабильности помещения: чтобы свести к минимуму людей, которым приходится менять комнаты
  • Нет 2 рок-спикеров одновременно
  • Рок-звезды получают лучшие временные интервалы
  • Социальные спикеры не получают утренние слоты
  • … и многое другое

Нам просто нужно больше входных данных, таких как: какие выступления популярны, какие ораторы — рок-звезды,…

Вывод

С другой стороны, это стало намного проще. Джи 7 просто работает. Это намного проще, чем его предшественники. Большинство грубых краев исчезло. Для полного раскрытия: я работаю в Red Hat, поэтому я придерживался их реализаций всякий раз, когда был выбор.

Однако, на фронте … выбор технологий настолько велик, что я не хочу что-то действительно рекомендовать: все они отстойные, все по-своему. Либо вы пишете много непонятного JavaScript, либо имеете дело с длинной монолитной компиляцией, либо вы застряли с чрезмерно сложным, болтливым жизненным циклом. И это только первые 3 фреймворка для веб-интерфейса!