Перейти к основному содержимому

Сессионные компоненты Java EE

· 5 мин. чтения

1. Введение

Корпоративные сеансовые компоненты можно разделить на:

  1. Сессионные компоненты без сохранения состояния
  2. Сессионные компоненты с отслеживанием состояния

В этой быстрой статье мы собираемся обсудить эти два основных типа сеансовых компонентов.

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.