Java EE Session Beans

Java EE Session Beans

1. Вступление

Компоненты Enterprise Session Bean можно в целом классифицировать на

  1. Сессионные бобы без гражданства

  2. Stateful Session Beans

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

2. Настроить

Чтобы использовать Enterprise Beans 3.2,, обязательно добавьте последнюю версию в разделdependencies файлаpom.xml:


    javax
    javaee-api
    7.0
    provided

Последнюю зависимость можно найти вMaven Repository. Эта зависимость гарантирует, что все API Java EE 7 доступны во время компиляции. Область действияprovided гарантирует, что после развертывания; зависимость будет предоставлена ​​контейнером, в котором она была развернута.

3. Бобы без сохранения состояния

Сессионный компонент без сохранения состояния - это тип корпоративного компонента, который обычно используется для выполнения независимых операций. У него нет связанного состояния клиента, но он может сохранить свое состояние экземпляра.

Давайте рассмотрим пример, чтобы продемонстрировать, как работает bean-компонент без сохранения состояния.

3.1 Creating the Stateless Bean

Сначала давайте создадим bean-компонентStatelessEJB. Мы используем аннотацию@Stateless, чтобы пометить компонент как не имеющий состояния:

@Stateless
public class StatelessEJB {

    public String name;

}

Затем мы создаем первого клиента указанного выше bean-компонента без сохранения состояния с именемEJBClient1:

public class EJBClient1 {

    @EJB
    public StatelessEJB statelessEJB;

}

Затем мы объявляем другого клиента с именемEJBClient2,, который обращается к тому же компоненту без сохранения состояния:

public class EJBClient2 {

    @EJB
    public StatelessEJB statelessEJB;

}

3.2 Testing the Stateless 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 в обоих клиентах, мы должны увидеть, что значение равно. This shows that state is not preserved in stateless beans.

Покажем, что это правда, другим способом. Во втором методе тестирования мы видим, что как только мы устанавливаем переменнуюname во втором клиенте, она «перезаписывает» любое значение, присвоенное ему черезejbClient1.

4. Бобы с отслеживанием состояния

Сессионные компоненты с сохранением состояния поддерживают состояние как внутри транзакций, так и между ними. Вот почему каждый сессионный компонент с состоянием связан с конкретным клиентом. Контейнеры могут автоматически сохранять и извлекать состояние компонента при управлении пулами экземпляров сессионных компонентов с сохранением состояния.

4.1 Creating the Stateful Bean

Сессионный компонент с отслеживанием состояния помечается аннотацией@Stateful. Код для бина с состоянием выглядит следующим образом:

@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 Testing the 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 и сохраняется, даже если значениеname устанавливается черезejbClient2 это отличается. This demonstrates that the state of the EJB is maintained.

5. Без гражданства против Сессионный компонент с отслеживанием состояния

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

5.1 Stateless Beans

  • Сессионные компоненты без сохранения состояния не поддерживают состояние с клиентом. По этой причине их можно использовать для создания пула объектов, которые взаимодействуют с несколькими клиентами.

  • Поскольку bean-компоненты без сохранения состояния не имеют состояния для каждого клиента, они лучше подходят для производительности.

  • Они могут обрабатывать несколько запросов от нескольких клиентов параллельно и

  • Может использоваться для извлечения объектов из баз данных

5.2 Stateful Beans

  • Сессионные компоненты с сохранением состояния могут поддерживать состояние с несколькими клиентами, и задача не распределяется между клиентами

  • Состояние длится в течение всего сеанса. После уничтожения сеанса состояние не сохраняется

  • Контейнер может сериализовать и хранить состояние как устаревшее состояние для будущего использования. Это делается для экономии ресурсов сервера приложений и для поддержки сбоев bean-компонентов и является пассивацией

  • Может использоваться для решения проблем типа производитель-потребитель

6. Заключение

Итак, мы создали два типа сессионных компонентов и соответствующих клиентов для вызова методов из компонентов. Проект демонстрирует поведение двух основных типов сессионных компонентов.

Как всегда, кодsource для статьи доступен на GitHub.