Beans de sessão do Java EE

Beans de sessão do Java EE

1. Introdução

O Enterprise Session Beans pode ser amplamente classificado em:

  1. Beans de sessão sem estado

  2. Stateful Session Beans

Neste artigo rápido, discutiremos esses dois tipos principais de beans de sessão.

2. Configuração

Para usar Enterprise Beans 3.2,, certifique-se de adicionar a versão mais recente à seçãodependencies do arquivopom.xml:


    javax
    javaee-api
    7.0
    provided

A dependência mais recente pode ser encontrada emMaven Repository. Essa dependência garante que todas as APIs do Java EE 7 estejam disponíveis durante o tempo de compilação. O escopoprovided garante que, uma vez implantado; a dependência será fornecida pelo contêiner onde foi implantado.

3. Feijão sem estado

Um bean de sessão sem estado é um tipo de bean corporativo que é comumente usado para executar operações independentes. Ele não possui nenhum estado de cliente associado, mas pode preservar seu estado de instância.

Vamos dar uma olhada em um exemplo para demonstrar como funciona um bean sem estado.

3.1 Creating the Stateless Bean

Primeiro, vamos criar o beanStatelessEJB. Usamos a anotação@Stateless para marcar o bean como sem estado:

@Stateless
public class StatelessEJB {

    public String name;

}

Em seguida, criamos o primeiro cliente do bean sem estado acima, chamadoEJBClient1:

public class EJBClient1 {

    @EJB
    public StatelessEJB statelessEJB;

}

Em seguida, declaramos outro cliente, denominadoEJBClient2,, que acessa o mesmo bean sem estado:

public class EJBClient2 {

    @EJB
    public StatelessEJB statelessEJB;

}

3.2 Testing the Stateless Bean

Para testar a apatridia do EJB, podemos usar os dois clientes que declaramos acima da seguinte maneira:

@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

}

Começamos injetando os dois clientes EBJ no teste de unidade.

Então, no primeiro método de teste, definimos a variávelname no EJB que foi injetado emEJBClient1 com o valorClient 1. Agora, quando comparamos o valor denamevariável s em ambos os clientes, devemos ver que o valor é igual. This shows that state is not preserved in stateless beans.

Vamos demonstrar que isso é verdade de uma maneira diferente. No segundo método de teste, vemos que, uma vez que definimos a variávelname no segundo cliente, ela ‘sobrescreve’ qualquer valor que lhe foi dado por meio deejbClient1.

4. Stateful Beans

Os beans de sessão com estado mantêm o estado dentro e entre as transações. É por isso que cada bean de sessão com estado está associado a um cliente específico. Os contêineres podem salvar e recuperar o estado de um bean automaticamente ao gerenciar conjuntos de instâncias de beans de sessão com estado.

4.1 Creating the Stateful Bean

Um bean de sessão com preservação de estado é marcado com a anotação@Stateful. O código para o bean com estado é o seguinte:

@Stateful
public class StatefulEJB {

    public String name;

}

O primeiro cliente local para nosso bean com estado é escrito da seguinte maneira:

public class EJBClient1 {

    @EJB
    public StatefulEJB statefulEJB;

}

Um segundo cliente chamadoEJBClient2 também é criado, assim como oEJBClient1:

public class EJBClient2 {

    @EJB
    public StatefulEJB statefulEJB;

}

4.2 Testing the Stateful Bean

A funcionalidade do bean com estado é testada no teste de unidadeEJBStatefulBeanTest da seguinte maneira:

@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

}

Como antes, os dois clientes EJB são injetados no teste de unidade. No método de teste, podemos ver que o valor da variávelname é definido por meio do clienteejbClient1 e é mantido mesmo que o valor dename definido por meio deejbClient2 é diferente. This demonstrates that the state of the EJB is maintained.

5. Sem Estado vs. Stateful Session Bean

Agora, vamos dar uma olhada na principal diferença entre os dois tipos de beans de sessão.

5.1 Stateless Beans

  • Os beans de sessão sem estado não mantêm nenhum estado com o cliente. Por esse motivo, eles podem ser usados ​​para criar um pool de objetos que interagem com vários clientes

  • Uma vez que os beans sem estado não têm nenhum estado por cliente, eles têm melhor desempenho

  • Eles podem lidar com várias solicitações de vários clientes em paralelo e

  • Pode ser usado para recuperar objetos de bancos de dados

5.2 Stateful Beans

  • Os beans de sessão com estado podem manter o estado com vários clientes e a tarefa não é compartilhada entre clientes

  • O estado dura a duração da sessão. Depois que a sessão é destruída, o estado não é retido

  • O contêiner pode serializar e armazenar o estado como um estado obsoleto para uso futuro. Isso é feito para economizar recursos do servidor de aplicativos e suportar falhas de bean e é passivação

  • Pode ser usado para resolver problemas do tipo produtor-consumidor

6. Conclusão

Portanto, criamos dois tipos de beans de sessão e clientes correspondentes para chamar os métodos dos beans. O projeto demonstra o comportamento dos dois principais tipos de beans de sessão.

Como sempre, o códigosource para o artigo está disponível no GitHub.