«1. Введение

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

  1. Stateless Session Beans
  2. 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>
The latest dependency can be found in the Maven Repository. This dependency ensures that all Java EE 7 APIs are available during compile time. The provided scope ensures that once deployed; the dependency will be provided by the container where it has been deployed.

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.