«1. Введение
Корпоративные сеансовые компоненты можно разделить на:
- Stateless Session Beans
- Stateful Session Beans
В этой быстрой статье мы обсудим эти два основных типа сеансовых компонентов.
2. Настройка
Чтобы использовать Enterprise Beans 3.2, обязательно добавьте последнюю версию в раздел зависимостей файла pom.xml:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
3. Компоненты без сохранения состояния
Сессионный компонент без сохранения состояния это тип корпоративного компонента, который обычно используется для выполнения независимых операций. У него нет связанного с ним состояния клиента, но он может сохранять свое состояние экземпляра.
Давайте рассмотрим пример, чтобы продемонстрировать, как работает bean-компонент без сохранения состояния.
3.1 Создание компонента без сохранения состояния
Сначала давайте создадим компонент StatelessEJB. Мы используем аннотацию @Stateless, чтобы пометить bean-компонент как не имеющий состояния:
@Stateless
public class StatelessEJB {
public String name;
}
Затем мы создаем первого клиента вышеупомянутого bean-компонента без сохранения состояния, называемого EJBClient1:
public class EJBClient1 {
@EJB
public StatelessEJB statelessEJB;
}
Затем мы объявляем другого клиента с именем EJBClient2, который обращается к одному и тому же bean-компоненту без сохранения состояния:
public class EJBClient2 {
@EJB
public StatelessEJB statelessEJB;
}
3.2 Тестирование Bean-компонента без сохранения состояния
Чтобы протестировать EJB без сохранения состояния, мы можем использовать два клиента, которые мы объявили выше, следующим образом:
@RunWith(Arquillian.class)
public class StatelessEJBTest {
@Inject
private EJBClient1 ejbClient1;
@Inject
private EJBClient2 ejbClient2;
@Test
public void givenOneStatelessBean_whenStateIsSetInOneBean
_secondBeanShouldHaveSameState() {
ejbClient1.statelessEJB.name = "Client 1";
assertEquals("Client 1", ejbClient1.statelessEJB.name);
assertEquals("Client 1", ejbClient2.statelessEJB.name);
}
@Test
public void givenOneStatelessBean_whenStateIsSetInBothBeans
_secondBeanShouldHaveSecondBeanState() {
ejbClient1.statelessEJB.name = "Client 1";
ejbClient2.statelessEJB.name = "Client 2";
assertEquals("Client 2", ejbClient2.statelessEJB.name);
}
// Arquillian setup code removed for brevity
}
Мы начинаем путем внедрения двух клиентов EBJ в модульный тест.
Затем, в первом тестовом методе, мы устанавливаем переменную name в EJB, которая была внедрена в EJBClient1, в значение Client 1. Теперь, когда мы сравним значение переменной name в обоих клиентах, мы должны увидеть, что значение равно. Это показывает, что состояние не сохраняется в bean-компонентах без состояния.
Давайте продемонстрируем, что это правда, по-другому. Во втором тестовом методе мы видим, что как только мы устанавливаем переменную name во втором клиенте, она «перезаписывает» любое значение, переданное ей через ejbClient1.
4. Компоненты с отслеживанием состояния
Сессионные компоненты с отслеживанием состояния поддерживают состояние как внутри, так и между транзакциями. Вот почему каждый сессионный компонент с отслеживанием состояния связан с конкретным клиентом. Контейнеры могут автоматически сохранять и извлекать состояние компонента при управлении пулами экземпляров сеансовых компонентов с отслеживанием состояния.
4.1 Создание компонента с отслеживанием состояния
Сессионный компонент с отслеживанием состояния помечен аннотацией @Stateful. Код для bean-компонента с отслеживанием состояния выглядит следующим образом:
@Stateful
public class StatefulEJB {
public String name;
}
Первый локальный клиент для нашего bean-компонента с отслеживанием состояния записывается следующим образом:
public class EJBClient1 {
@EJB
public StatefulEJB statefulEJB;
}
Второй клиент с именем EJBClient2 также создается точно так же, как EJBClient1: ~~ ~
public class EJBClient2 {
@EJB
public StatefulEJB statefulEJB;
}
4.2 Тестирование бина с отслеживанием состояния
Функциональность бина с отслеживанием состояния проверяется в модульном тесте EJBStatefulBeanTest следующим образом:
@RunWith(Arquillian.class)
public class StatefulEJBTest {
@Inject
private EJBClient1 ejbClient1;
@Inject
private EJBClient2 ejbClient2;
@Test
public void givenOneStatefulBean_whenTwoClientsSetValueOnBean
_thenClientStateIsMaintained() {
ejbClient1.statefulEJB.name = "Client 1";
ejbClient2.statefulEJB.name = "Client 2";
assertNotEquals(ejbClient1.statefulEJB.name, ejbClient2.statefulEJB.name);
assertEquals("Client 1", ejbClient1.statefulEJB.name);
assertEquals("Client 2", ejbClient2.statefulEJB.name);
}
// Arquillian setup code removed for brevity
}
Как и прежде, два EJB-клиента внедряются в модульный тест. В тестовом методе мы видим, что значение переменной name устанавливается через клиент ejbClient1 и сохраняется, даже если значение имени, установленное через ejbClient2, отличается. Это демонстрирует, что состояние EJB сохраняется.
5. Сессионные компоненты без состояния и с сохранением состояния
Теперь давайте посмотрим на основную разницу между двумя типами сеансовых компонентов.
5.1 Компоненты без сохранения состояния
-
Сеансовые компоненты без сохранения состояния не поддерживают никакого состояния с клиентом. По этой причине их можно использовать для создания пула объектов, которые взаимодействуют с несколькими клиентами. Поскольку bean-компоненты без сохранения состояния не имеют состояния для каждого клиента, они более производительны. Они могут обрабатывать несколько запросов от нескольких клиентов параллельно и могут использоваться. для извлечения объектов из баз данных
5.2 Компоненты с отслеживанием состояния
-
Сессионные компоненты с отслеживанием состояния могут поддерживать состояние с несколькими клиентами, и задача не распределяется между клиентами. Состояние сохраняется в течение всего сеанса. После уничтожения сеанса состояние не сохраняется. Контейнер может сериализовать и сохранять состояние как устаревшее для использования в будущем. Это делается для экономии ресурсов сервера приложений и поддержки отказов bean-компонентов, и это пассивация. Может использоваться для решения проблем типа производитель-потребитель
6. Заключение
Итак, мы создали два типа сеансовых bean-компонентов и соответствующих клиентов для вызова методы из бобов. Проект демонстрирует поведение двух основных типов сеансовых компонентов.
«Как всегда, исходный код статьи доступен на GitHub.