Конференция Java2Days — это крупнейшее мероприятие в Восточной Европе, на котором представлены последние тенденции развития Java. В этом году это произошло в Софии, Болгария, 25 — 26 октября. Я был там и получил возможность попробовать передовой Java, облачный и мобильный контент, доставленный прямо в мой город, вместе с несколькими моими коллегами из SAP .
Я посещаю это мероприятие второй год подряд. В этом году это было больше и включало новые вещи, такие как «Бесплатные технические тренинги». Существует также конкурс (открыт до 11 ноября) с некоторыми интересными задачами программирования.
В этом посте я хотел бы поделиться краткими резюме некоторых из сессий конференции, которые я посетил, основываясь на моих заметках и некоторых дополнительных исследованиях, которые я провел впоследствии.
- JavaEE.Next (): Java EE 7, 8 и выше , автор Реза Рахман
- Создание приложений HTML5 / WebSocket с помощью GlassFish, Grizzly и JSR 356 , автор Реза Рахман
- Управляемый доменом дизайн с Java EE 6 , Реза Рахман
JavaEE.Next (): Java EE 7, 8 и выше
На открытии конференции Реза Рахман (Reza Rahman) , евангелист Java EE / GlassFish в Oracle, представил основные изменения в предстоящей седьмой редакции Java EE, которая должна быть выпущена в марте / апреле следующего года, а также познакомился с Java. EE 8. Мы узнали, что облачная поддержка отложена до Java EE 8, и увидели обзор различных изменений, таких как пересмотр поддержки JMS, WebSocket и HTML 5, стандартного API для обработки JSON, следующей версии JAX-RS, API кеширования и многое другое.
JMS 2.0
Новая версия Java Message Service (JMS) , которая в настоящее время разрабатывается как JSR 343, представляет некоторые значительные улучшения по сравнению с существующей JMS 1.1, которая была выпущена почти 5 лет назад. Он вводит новые функции обмена сообщениями, такие как пакетная доставка и задержка доставки, а также несколько изменений в JMS API, чтобы сделать его проще и проще в использовании, например, новые аннотации и внедрение зависимостей. С новым API отправка сообщения включает в себя инъекцию контекста, поиск очереди и, наконец, один вызов метода со всеми необходимыми объектами, созданными на лету:
1
2
3
4
5
6
7
8
9
|
@Inject private JMSContext context; @Resource (mappedName = "jms/inboundQueue" ) private Queue inboundQueue; public void sendMessage(String payload) { context.createProducer().send(inboundQueue, payload); } |
См. Также JMS 2.0 Early Draft .
Java API для WebSocket
Java API для WebSocket ( JSR 356 ) — это новая спецификация, впервые представленная в Java EE 7. Он содержит как серверный, так и клиентский API для WebSocket , в двух различных вариантах — программном и декларативном. Для получения дополнительной информации см. Краткую информацию о специальной сессии по этой теме ниже.
Java API для обработки JSON
Java API для обработки JSON ( JSR 353 ) также является новой спецификацией, которая дает возможность анализировать, генерировать, преобразовывать и запрашивать содержимое JSON. Он имеет как объектную модель, так и потоковые API, похожие на DOM и StAX в мире XML. В будущем будет также привязка JSON к объектам Java, аналогичным JAXB , но на данный момент это все еще не входит в сферу применения этого JSR. См. Также JSON-P: Java API для обработки JSON .
JAX-RS 2.0
Основными дополнениями в следующей версии Java API для RESTful Web Services (JAX-RS) являются стандартный клиентский API, а также новые функции, такие как фильтры и обработчики сообщений, перехватчики объектов, асинхронная обработка, поддержка гипермедиа и общая конфигурация. См. Также JAX-RS 2.0 .
API Java Caching
API Java Caching API ( JSR 107 ) томился уже почти 10 лет и, наконец, станет частью Java EE. Он вводит стандартный API и аннотации для хранения и извлечения объектов из кэша. API довольно прост, например, для помещения объекта customer в кеш потребуется код, подобный следующему:
1
2
3
4
5
6
7
8
|
public class CustomerDao { @CachePut (cacheName = "customers" ) public void addCustomer( @CacheKeyParam int cid, @CacheValue Customer customer) { ... } } |
Другие особенности Java EE 7
- В JPA 2.1 добавлена генерация встроенной схемы, включая индексы, а также поддержка хранимых процедур и другие улучшения.
- JTA 1.2 представляет поддержку декларативных транзакций вне EJB и аннотацию @
TransactionScoped
. - В JSF 2.2 представлена улучшенная поддержка HTML5, включая островки HTML5 на страницах JSF и привязку типов ввода HTML5 к бинам JSF, а также дополнительные аннотации, такие как
@FlowScoped
и@ViewScoped
, выравнивание CDI и т. Д. - Пакетная обработка для Java EE — это новая спецификация, в которой представлен API для пакетной обработки, основанный на заданиях, состоящих из этапов, каждый из которых включает чтение, обработку и запись элементов. Вместо реализации интерфейсов методы чтения, обработки и записи элементов можно просто аннотировать как
@ReadItem
,@ProcessItem
и@WriteItem
- В Bean Validation 1.1 вводятся ограничения метода и вводимые артефакты.
Java EE 8
Ожидается, что восьмая редакция JavaEE будет выпущена через 2 года после Java EE 7, то есть в 2015 году. Она будет сосредоточена на следующих областях:
- Облако, PaaS, мультитенанс
- Модулатеры по мотивам Jigsaw
- Еще лучшая поддержка HTML5
- Больше выравнивания CDI и EJB
- NoSQL (?)
Резюме
Это было действительно много информации, которую нужно проглотить за 45 минут, но докладчик хорошо поработал, предоставив ее. Похоже, что Java EE 7 станет хорошим дополнением к серии, и в Java EE 8 появятся еще более важные функции.
Слайды этой сессии доступны здесь . Вы можете попробовать эти новые функции, загрузив GlassFish 4 . Чтобы быть в курсе, вы можете следить за блогом Аквариума .
Создание приложений HTML5 / WebSocket с помощью GlassFish, Grizzly и JSR 356
Фактически это была последняя сессия конференции, на которой Реза Рахман представил одну очень интересную часть грядущей Java EE 7, а именно поддержку WebSocket.
WebSocket Primer
Двусторонняя связь по полудуплексному протоколу HTTP всегда была проблемой. Были представлены разновидности push-уведомлений сервера, таких как опрос, длинный опрос или AJAX, но они сложны, неэффективны и расточительны.
Напротив, WebSocket предоставляет двунаправленный, дуплексный канал связи через один сокет TCP. Однако, в отличие от чистого TCP, все коммуникации осуществляются через стандартный порт HTTP (например, 80), что позволяет ему работать в средах, которые блокируют нестандартные подключения к Интернету с помощью брандмауэра. Первоначально он был предложен как часть HTML 5.
W3C определяет очень простой API WebSocket JavaScript и протокол WebSocket . Протокол определяет «рукопожатие» и «кадрирование», где рукопожатие определяет, как обычное HTTP-соединение может быть обновлено до соединения WebSocket, а кадрирование определяет проводной формат сообщения. API определяет методы для открытия и закрытия соединения и для отправки сообщения в различных вариантах. В настоящее время поддерживается всеми основными браузерами.
Java API для WebSocket
Java EE 7 представляет поддержку WebSocket через Java API для WebSocket ( JSR 356 ). Эталонная реализация называется Tyrus и является частью GlassFish 4. Спецификация определяет два различных варианта API — программный на основе интерфейсов и декларативный на основе аннотаций как для клиента, так и для сервера.
Декларативный API чрезмерно упрощен и полностью скрывает внутренние компоненты WebSocket от разработчика. В простейшей форме конечная точка WebSocket может быть определена следующим образом:
1
2
3
4
5
6
7
8
|
@WebSocketEndpoint ( "/hello" ) public class HelloBean { @WebSocketMessage public String sayHello(String name) { return "Hello " + name; } } |
Есть следующие аннотации:
-
@WebSocketEndpoint
— это аннотация уровня класса, которая объявляет POJO для приема сообщений WebSocket. Путь, по которому принимаются сообщения, указан в этой аннотации. При желании он также может указывать декодеры, кодеры и подпротоколы. -
@WebSocketMessage
— это аннотация уровня метода, которая используется для метода, который вызывается, когда конечная точка получает сообщение. Значение, возвращаемое этим методом, отправляется обратно на другую сторону. -
@WebSocketOpen
и@WebSocketClose
— это аннотации на уровне метода для перехвата событий открытия и закрытия соединения. -
@WebSocketError
— это аннотации уровня метода для перехвата ошибок во время разговора. -
@WebSocketParam
— аннотация на уровне параметров для сегментов пути, которые передаются в качестве параметров.
Резюме
WebSocket, похоже, действительно является гораздо лучшей альтернативой используемым в настоящее время подходам к продвижению сервера, поэтому здорово, что поддержка этого в JavaEE появится довольно скоро.
Слайды этой сессии доступны здесь . Аналогичная презентация уже доступна на Slideshare, Создание приложений HTML5 WebSocket на Java .
Проектирование на основе домена с помощью Java EE 6
Третий сеанс Java EE Резы Рахман был посвящен доменно-управляемому дизайну (DDD) . Это подход к разработке программного обеспечения путем соединения реализации с развивающейся моделью. Его предпосылка заключается в том, чтобы сосредоточить основное внимание на проекте на основном домене и доменной логике, а также на основе проектов на модели домена. Термин был впервые введен Эриком Эвансом в его одноименной книге . DDD подчеркивает возвращение к объектно-ориентированному анализу и проектированию и постепенно набирает популярность как альтернатива традиционным архитектурам, первоначально популяризированным J2EE Blue Prints. Цель этого занятия состояла в том, чтобы продемонстрировать, как DDD может быть реализован с использованием Java EE 6, путем сопоставления его основных концепций со спецификациями Java EE и предоставлением подробного примера кода.
Основные понятия
- Область : сфера знаний (онтология), влияния или деятельности.
- Модель : система абстракций, которая описывает выбранные аспекты домена и может использоваться для решения проблем, связанных с этим доменом.
- Повсеместный язык : язык, структурированный по модели предметной области и используемый всеми членами команды.
- Контекст : параметр, в котором появляется слово или утверждение, определяющее его значение.
Строительные блоки
Диаграмма ниже является «каноническим изображением» доменного дизайна.
- Сущность : объект, который не определяется его атрибутами, а скорее потоком непрерывности и его идентичностью.
- Объект значения : объект, который содержит атрибуты, но не имеет концептуальной идентичности.
- Агрегат : коллекция объектов, которые связаны друг с другом корневым объектом, иначе называемым агрегированным корнем.
- Сервис : когда операция концептуально не принадлежит ни одному объекту.
- Репозиторий : Методы для извлечения объектов домена должны делегироваться специализированному объекту Репозитория.
- Фабрика : Методы для создания объектов домена должны делегироваться специализированному объекту Фабрики.
Поддержание целостности модели (стратегический DDD)
Слои
Пользовательский интерфейс: показывает информацию о пользователе и получает ввод.
- Приложение : тонкий слой для координации действий приложения. На этом уровне нет бизнес-логики или состояния бизнес-объекта.
- Домен : Здесь находятся все бизнес-объекты и их состояние. Объекты в доменном слое не должны беспокоиться о отображении или сохранении самих себя.
- Инфраструктура : объекты, занимающиеся домашними заданиями, такими как постоянство.
Отображение DDD в Java EE
DDD Concept / Layer | Концепция Java EE |
---|---|
контекст | Упаковка, Модульность |
UI Layer | JSF, Сервлет |
Услуги, прикладной уровень | EJB, CDI |
Сущности, Объекты Значения, Хранилища | JPA (организации), CDI |
Уровень инфраструктуры | JPA (API Entity Manager), JMS |
Образец заявки
Пример приложения, который был продемонстрирован во время демонстрации, является развитием образца DDD, уже доступного на SourceForge. Это приложение Shipping Tracker. Структура упаковки приложения четко показывает различные слои, упомянутые выше. Обновленный образец приложения DDD скоро будет опубликован в виде проекта java.net . До этого вы можете загружать и играть с существующим образцом DDD, который он собирает с Maven, можно запускать во встроенной Jetty и, конечно, импортировать в Eclipse для более глубокого изучения.
Резюме
Я нашел ДДД довольно интересным, хотя поначалу его было немного сложно понять. Реза все подробно объяснил, однако это сократило время, необходимое для демонстрации и показа кода примера приложения. Я и мои коллеги были заинтригованы тем фактом, что бизнес-логика в образце записана в самих классах уровня домена без какого-либо контроллера фасадов. Изначально это казалось мне несколько необычным подходом, но через секунду это имело смысл.
Слайды этой сессии доступны здесь. Исследуя DDD после конференции, я нашел следующие интересные ресурсы:
- Проектирование на основе доменов Краткое, краткое и кратко читаемое резюме и введение в основы DDD.
- Доменно-управляемый дизайн с Java EE 6 , статья в JavaWorld (2009).
- Сообщество по разработке доменов .
Ссылка: Java2Days 2012: Java EE от нашего партнера по JCG Стояна Рачева в блоге Стояна Рачева .