1. Введение
Корпоративные сеансовые компоненты можно разделить на:
- Сессионные компоненты без сохранения состояния
- Сессионные компоненты с отслеживанием состояния
В этой быстрой статье мы собираемся обсудить эти два основных типа сеансовых компонентов.
2. Настройка
Чтобы использовать Enterprise Beans 3.2 , обязательно добавьте последнюю версию в раздел зависимостей файла
pom.xml
:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
Последнюю зависимость можно найти в репозитории Maven . Эта зависимость гарантирует, что все API Java EE 7 будут доступны во время компиляции. Предоставленная область гарантирует, что после развертывания ;
зависимость будет предоставлена контейнером, в котором она была развернута.
3. Фасоль без гражданства
Сессионный компонент без сохранения состояния — это тип корпоративного компонента, который обычно используется для выполнения независимых операций. У него нет связанного с ним состояния клиента, но он может сохранять свое состояние экземпляра.
Давайте посмотрим на пример, чтобы продемонстрировать, как работает bean-компонент без сохранения состояния.
3.1. Создание bean-компонента без сохранения состояния
Во-первых, давайте создадим bean- компонент 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. Тестирование компонента без сохранения состояния
Чтобы проверить отсутствие состояния 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-компонентах без состояния .
Покажем, что это правда, по-другому. Во втором тестовом методе мы видим, что как только мы устанавливаем переменную имени
во втором клиенте, она «перезаписывает» любое значение, переданное ей через ejbClient1
.
4. Компоненты с отслеживанием состояния
Сессионные компоненты с отслеживанием состояния поддерживают состояние как внутри, так и между транзакциями. Вот почему каждый сессионный компонент с отслеживанием состояния связан с конкретным клиентом. Контейнеры могут автоматически сохранять и извлекать состояние компонента при управлении пулами экземпляров сеансовых компонентов с отслеживанием состояния.
4.1. Создание компонента с отслеживанием состояния
Сессионный компонент с отслеживанием состояния помечен аннотацией @Stateful
. Код для 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. Тестирование Stateful Bean
Функциональность bean-компонента с отслеживанием состояния проверяется в модульном тесте 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. Заключение
Итак, мы создали два типа сеансовых компонентов и соответствующих клиентов для вызова методов из компонентов. Проект демонстрирует поведение двух основных типов сеансовых компонентов.
Как всегда, исходный код статьи доступен на GitHub.