Статьи

Поддержка Java EE 7 и EJB 3.2 в JBoss AS 8

Некоторые из вас могут знать, что была выпущена публичная версия окончательной версии спецификации Java EE 7. Среди множества других новинок эта версия Java EE содержит версию спецификации EJB EJB 3.2. EJB 3.2 имеет некоторые новые функции по сравнению со спецификацией EJB 3.1. Я цитирую здесь текст, представленный в спецификации EJB 3.2, в котором обобщается, что нового:

Архитектура Enterprise JavaBeans 3.2 расширяет Enterprise JavaBeans и включает в себя следующие новые функции и упрощения более ранних API-интерфейсов EJB:

    • Поддержка следующих функций в этом выпуске стала необязательной, а их описание перенесено в отдельный документ по дополнительным функциям EJB:
      • EJB 2.1 и более ранние контракты на компонент EJB для персистентности, управляемой контейнером
      • EJB 2.1 и более ранние контракты на компонент EJB для персистентности, управляемой бином
      • Клиентское представление EJB 2.1 и более ранних компонентов Entity Bean
      • EJB QL: язык запросов для методов постоянных запросов, управляемых контейнером
      • Конечные точки веб-службы на основе JAX-RPC
      • Представление клиента веб-службы JAX-RPC
    • Добавлена ​​поддержка локальных асинхронных вызовов сессионных компонентов и непостоянного сервиса таймера EJB в EJB 3.2 Lite.
    • Убрано ограничение на получение загрузчика текущего класса; заменил «не должен» на «следует проявлять осторожность» при использовании пакета ввода-вывода Java.
    • Добавлена ​​опция для методов перехвата обратного вызова жизненного цикла, состоящих из сеансовых компонентов с сохранением состояния, которые должны выполняться в контексте транзакции, определяемой атрибутом транзакции метода обратного вызова жизненного цикла.
    • Добавлена ​​опция для отключения пассивации сессионных компонентов с сохранением состояния.
    • Расширен API-интерфейс TimerService для запроса всех активных таймеров в одном модуле EJB.
    • Убраны ограничения на ссылки javax.ejb.Timer и javax.ejb.TimerHandle, которые будут использоваться только внутри bean-компонента.
    • Расслабленные правила по умолчанию для обозначения реализованных интерфейсов для сессионного компонента в качестве локальных или удаленных бизнес-интерфейсов.
    • Расширен список стандартных свойств активации.
  • Усовершенствованный встраиваемый EJBContainer за счет реализации интерфейса AutoClosable.

Как видно, некоторые из предложенных изменений незначительны. Но есть некоторые полезные серьезные изменения. Мы рассмотрим пару таких изменений в этой статье.

1) Новый API TimerService.getAllTimers ()

Версия EJB 3.2 представляет новый метод в интерфейсе javax.ejb.TimerService, называемый getAllTimers. Ранее интерфейс TimerService имел (и до сих пор имеет) метод getTimers. Ожидалось, что метод getTimers вернет активные таймеры, которые применимы к бобу, для которого был вызван метод TimerService (помните: на EJB есть один TimerService).

В этой новой версии EJB 3.2 ожидается, что недавно добавленный метод getAllTimers () вернет все активные таймеры, которые применимы ко * всем компонентам в одном и том же модуле EJB *. Как правило, модуль EJB соответствует банке EJB, но это также может быть развертывание .war, если EJB упакованы в .war. Этот новый метод getAllTimers () представляет собой удобный API для пользовательских приложений, которым необходимо найти все активные таймеры в модуле EJB, к которому принадлежит этот компонент.

2) Возможность отключить пассивацию бинов с состоянием

Те, кто знаком с EJB, будут знать, что контейнер EJB обеспечивает пассивацию (сохранение состояния bean-компонента с состоянием в некотором вторичном хранилище) и активацию (загрузка сохраненного состояния bean-компонента с состоянием) в bean-компоненты с состоянием. Однако в предыдущих версиях EJB не было портативного способа отключения пассивации bean-компонентов с состоянием, если пользовательское приложение желало это сделать. Новая версия EJB 3.2 представляет способ, с помощью которого пользовательское приложение может решить, может ли bean-компонент с сохранением состояния пассивироваться или нет.

По умолчанию bean-компонент с сохранением состояния считается «способным к пассивации» (как старые версии EJB). Однако, если пользователь хочет отключить поддержку пассивации для определенного bean-компонента с состоянием, он может отключить его с помощью аннотации или дескриптора развертывания ejb-jar.xml. Сделать это можно так же просто, как установить атрибут passivationCapable в аннотации @ javax.ejb.Stateful в false. Что-то типа:

1
2
3
4
@javax.ejb.Stateful(passivationCapable=false) // the passivationCapable attribute takes a boolean value 
 public class MyStatefulBean { 
 .... 
 }

Делаем это в ejb-jar.xml следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?> 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
      version="3.2"
   <enterprise-beans
     <session
       <ejb-name>foo-bar-bean</ejb-name
       <ejb-class>org.myapp.FooBarStatefulBean</ejb-class
       <session-type>Stateful</session-type
       <!-- passivation-capable element takes either a true or a false value --> 
       <passivation-capable>false</passivation-capable
     </session
     ... 
   </enterprise-beans
 </ejb-jar>

В этом ejb-jar.xml следует отметить две важные вещи: атрибут version = 3.2 (вместе с расположением схемы http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd) в ejb- корневой элемент jar и элемент с поддержкой пассивации под элементом session. Таким образом, использование любого из этих подходов позволит вам отключить пассивацию для bean-компонентов с состоянием, если вы хотите это сделать.

Поддержка Java EE 7 и EJB 3.2 в JBoss AS8:

JBoss AS8 добавляет поддержку Java EE 7 с тех пор, как была объявлена ​​публичная версия финальной версии спецификации. Поддержка EJB 3.2 уже добавлена ​​и доступна. Некоторые другие изменения в Java EE 7 также были внесены в последние сборки JBoss AS 8. Чтобы отслеживать изменения Java EE 7 в JBoss AS8, следите за этим JIRA https://issues.jboss.org/browse/AS7-6553 .

Чтобы использовать уже реализованные функции Java EE 7 в целом или EJB 3.2 в частности, вы можете скачать последнюю версию / двоичную версию JBoss AS отсюда . Попробуйте и дайте нам знать, как это происходит. Для любых отзывов, вопросов или если у вас возникнут какие-либо проблемы, не стесняйтесь открывать дискуссионную ветку на нашем форуме пользователей здесь .

Справка: поддержка Java EE 7 и EJB 3.2 в JBoss AS 8 поддерживается нашим партнером по JCG Джейкираном Паем в блоге Jaikiran My Wiki .