Java EE Session Beans

1. Introduzione

Gli Enterprise Session Beans possono essere classificati a grandi linee in:

  1. Fagioli di sessione senza stato
  2. Stateful Session Beans

In questo rapido articolo, discuteremo questi due tipi principali di bean di sessione.

2. Configurazione

Per utilizzare Enterprise Beans 3.2 , assicurati di aggiungere l'ultima versione alla sezione delle dipendenze del file pom.xml :

 javax javaee-api 7.0 provided 
L'ultima dipendenza può essere trovata nel repository Maven. Questa dipendenza garantisce che tutte le API Java EE 7 siano disponibili durante la fase di compilazione. L' ambito fornito garantisce che, una volta distribuito; la dipendenza sarà fornita dal contenitore in cui è stata distribuita.

3. Fagioli apolidi

Un bean di sessione senza stato è un tipo di bean enterprise comunemente utilizzato per eseguire operazioni indipendenti. Non ha alcuno stato client associato, ma può conservare il suo stato di istanza.

Diamo un'occhiata a un esempio per dimostrare come funziona un bean senza stato.

3.1 Creazione dello Stateless Bean

Per prima cosa, creiamo il bean StatelessEJB . Usiamo l' annotazione @Stateless per contrassegnare il bean come senza stato:

@Stateless public class StatelessEJB { public String name; }

Quindi creiamo il primo client del bean stateless di cui sopra, chiamato EJBClient1 :

public class EJBClient1 { @EJB public StatelessEJB statelessEJB; }

Dichiariamo quindi un altro client, denominato EJBClient2, che accede allo stesso bean senza stato:

public class EJBClient2 { @EJB public StatelessEJB statelessEJB; }

3.2 Test del fagiolo apatico

Per testare l'apolidia dell'EJB, possiamo utilizzare i due client che abbiamo dichiarato sopra nel modo seguente:

@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 }

Iniziamo inserendo i due client EBJ nello unit test.

Quindi, nel primo metodo di test, impostiamo la variabile name nell'EJB che è stato iniettato in EJBClient1 al valore Client 1. Ora, quando confrontiamo il valore della variabile name in entrambi i client, dovremmo vedere che il valore è uguale . Ciò mostra che lo stato non è conservato nei bean apolidi .

Dimostriamo che questo è vero in un modo diverso. Nel secondo metodo di test, vediamo che una volta impostata la variabile name nel secondo client, "sovrascrive" qualsiasi valore gli sia stato assegnato tramite ejbClient1 .

4. Stateful Beans

I bean di sessione con stato mantengono lo stato sia all'interno che tra le transazioni. Questo è il motivo per cui ogni bean di sessione stateful è associato a un client specifico. I contenitori possono salvare e recuperare lo stato di un bean automaticamente durante la gestione dei pool di istanze di bean di sessione con stato.

4.1 Creazione dello Stateful Bean

Un bean di sessione stateful è contrassegnato con l' annotazione @Stateful . Il codice per il bean stateful è il seguente:

@Stateful public class StatefulEJB { public String name; }

Il primo client locale per il nostro bean stateful è scritto come segue:

public class EJBClient1 { @EJB public StatefulEJB statefulEJB; }

Viene creato anche un secondo client chiamato EJBClient2 proprio come EJBClient1 :

public class EJBClient2 { @EJB public StatefulEJB statefulEJB; }

4.2 Test di Stateful Bean

La funzionalità del bean stateful viene testata nello unit test EJBStatefulBeanTest nel modo seguente:

@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 }

Come prima, i due client EJB vengono inseriti nello unit test. Nel metodo di test, possiamo vedere che il valore della variabile name viene impostato tramite il client ejbClient1 e viene mantenuto anche se il valore del nome impostato tramite ejbClient2 è diverso. Ciò dimostra che lo stato dell'EJB viene mantenuto .

5. Stateless vs Stateful Session Bean

Ora diamo uno sguardo alla principale differenza tra i due tipi di bean di sessione.

5.1 Fagioli apolidi

  • I bean di sessione senza stato non mantengono alcuno stato con il client. Per questo motivo, possono essere utilizzati per creare un pool di oggetti che interagiscono con più client
  • Poiché i bean senza stato non hanno alcuno stato per client, sono migliori in termini di prestazioni
  • Possono gestire più richieste da più client in parallelo e
  • Può essere utilizzato per recuperare oggetti dai database

5.2 Stateful Beans

  • I bean di sessione con stato possono mantenere lo stato con più client e l'attività non viene condivisa tra i client
  • Lo stato dura per la durata della sessione. Dopo che la sessione è stata distrutta, lo stato non viene mantenuto
  • Il contenitore può serializzare e archiviare lo stato come stato non aggiornato per un utilizzo futuro. Questa operazione viene eseguita per salvare le risorse del server delle applicazioni e per supportare gli errori dei bean ed è la passivazione
  • Può essere utilizzato per risolvere problemi di tipo produttore-consumatore

6. Conclusione

Quindi abbiamo creato due tipi di bean di sessione e client corrispondenti per richiamare i metodi dai bean. Il progetto mostra il comportamento dei due principali tipi di bean di sessione.

Come sempre, il codice sorgente dell'articolo è disponibile su GitHub.