EJB - Stateless Bean

Un bean di sessione senza stato è un tipo di bean enterprise, normalmente utilizzato per eseguire operazioni indipendenti. Un bean di sessione senza stato secondo il suo nome non ha alcuno stato client associato, ma può conservare il suo stato di istanza. EJB Container normalmente crea un pool di pochi oggetti di bean senza stato e utilizza questi oggetti per elaborare la richiesta del client. A causa del pool, i valori delle variabili di istanza non sono garantiti per essere gli stessi nelle ricerche / chiamate di metodo.

Procedura per creare un bean stateless

Di seguito sono riportati i passaggi necessari per creare un EJB senza stato:

  • Creare un'interfaccia remota / locale che esponga i metodi aziendali.

  • Questa interfaccia verrà utilizzata dall'applicazione client EJB.

  • Utilizzare l'annotazione @Local, se il client EJB si trova nello stesso ambiente in cui deve essere distribuito il bean di sessione EJB.

  • Utilizzare l'annotazione @Remote, se il client EJB si trova in un ambiente diverso in cui deve essere distribuito il bean di sessione EJB.

  • Creare un bean di sessione senza stato, implementando l'interfaccia precedente.

  • Usa l'annotazione @Stateless per indicare che è un bean senza stato. EJB Container crea automaticamente le relative configurazioni o interfacce richieste leggendo questa annotazione durante la distribuzione.

Interfaccia remota

import javax.ejb.Remote;
 
@Remote
public interface LibrarySessionBeanRemote {
   //add business method declarations
}

EJB senza stato

@Stateless
public class LibrarySessionBean implements LibrarySessionBeanRemote {
   //implement business method 
}

Applicazione di esempio

Creiamo un'applicazione EJB di prova per testare EJB senza stato.

Passo Descrizione
1

Creare un progetto con un nome EjbComponent sotto un pacchetto com.tutorialspoint.stateless come spiegato nel capitolo EJB - Crea applicazione . È inoltre possibile utilizzare il progetto creato nel capitolo EJB - Crea applicazione come tale per questo capitolo per comprendere i concetti EJB senza stato.

2

Creare LibrarySessionBean.java e LibrarySessionBeanRemote come spiegato nel capitolo EJB - Crea applicazione . Mantieni il resto dei file invariato.

3

Pulisci e crea l'applicazione per assicurarti che la logica aziendale funzioni secondo i requisiti.

4

Infine, distribuisci l'applicazione sotto forma di file jar su JBoss Application Server. JBoss Application Server verrà avviato automaticamente se non è ancora stato avviato.

5

Ora crea il client EJB, un'applicazione basata su console nello stesso modo spiegato nel capitolo EJB - Crea applicazione sotto l'argomentoCreate Client to access EJB.

EJBComponent (modulo EJB)

LibrarySessionBeanRemote.java

package com.tutorialspoint.stateless;
 
import java.util.List;
import javax.ejb.Remote;
 
@Remote
public interface LibrarySessionBeanRemote {
   void addBook(String bookName);
   List getBooks();
}

LibrarySessionBean.java

package com.tutorialspoint.stateless;
 
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
 
@Stateless
public class LibrarySessionBean implements LibrarySessionBeanRemote {
    
   List<String> bookShelf;    
 
   public LibrarySessionBean() {
      bookShelf = new ArrayList<String>();
   }
 
   public void addBook(String bookName) {
      bookShelf.add(bookName);
   }    
 
   public List<String> getBooks() {
      return bookShelf;
   }
}
  • Non appena distribuisci il progetto EjbComponent su JBOSS, osserva il registro jboss.

  • JBoss ha creato automaticamente una voce JNDI per il nostro bean di sessione - LibrarySessionBean/remote.

  • Useremo questa stringa di ricerca per ottenere un oggetto business remoto di tipo - com.tutorialspoint.stateless.LibrarySessionBeanRemote

Output del registro di JBoss Application Server

...
16:30:01,401 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
   LibrarySessionBean/remote - EJB3.x Default Remote Business Interface
   LibrarySessionBean/remote-com.tutorialspoint.stateless.LibrarySessionBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO  [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibrarySessionBean,service=EJB3
16:30:02,723 INFO  [EJBContainer] STARTED EJB: com.tutorialspoint.stateless.LibrarySessionBeanRemote ejbName: LibrarySessionBean
16:30:02,731 INFO  [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
 
   LibrarySessionBean/remote - EJB3.x Default Remote Business Interface
   LibrarySessionBean/remote-com.tutorialspoint.stateless.LibrarySessionBeanRemote - EJB3.x Remote Business Interface
...

EJBTester (client EJB)

jndi.properties

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
  • Queste proprietà vengono utilizzate per inizializzare l'oggetto InitialContext del servizio di denominazione java.

  • L'oggetto InitialContext verrà utilizzato per cercare il bean di sessione senza stato.

EJBTester.java

package com.tutorialspoint.test;
   
import com.tutorialspoint.stateful.LibrarySessionBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
public class EJBTester {
 
   BufferedReader brConsoleReader = null; 
   Properties props;
   InitialContext ctx;
   {
      props = new Properties();
      try {
         props.load(new FileInputStream("jndi.properties"));
      } catch (IOException ex) {
         ex.printStackTrace();
      }
      try {
         ctx = new InitialContext(props);            
      } catch (NamingException ex) {
         ex.printStackTrace();
      }
      brConsoleReader = 
      new BufferedReader(new InputStreamReader(System.in));
   }
   
   public static void main(String[] args) {
 
      EJBTester ejbTester = new EJBTester();
 
      ejbTester.testStatelessEjb();
   }
   
   private void showGUI() {
      System.out.println("**********************");
      System.out.println("Welcome to Book Store");
      System.out.println("**********************");
      System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
   }
   
   private void testStatelessEjb() {
 
      try {
         int choice = 1; 
 
         LibrarySessionBeanRemote libraryBean =
         LibrarySessionBeanRemote)ctx.lookup("LibrarySessionBean/remote");
 
         while (choice != 2) {
            String bookName;
            showGUI();
            String strChoice = brConsoleReader.readLine();
            choice = Integer.parseInt(strChoice);
            if (choice == 1) {
               System.out.print("Enter book name: ");
               bookName = brConsoleReader.readLine();
               Book book = new Book();
               book.setName(bookName);
               libraryBean.addBook(book);          
            } else if (choice == 2) {
               break;
            }
         }
 
         List<Book> booksList = libraryBean.getBooks();
 
         System.out.println("Book(s) entered so far: " + booksList.size());
         int i = 0;
         for (Book book:booksList) {
            System.out.println((i+1)+". " + book.getName());
            i++;
         }       
         LibrarySessionBeanRemote libraryBean1 = 
            (LibrarySessionBeanRemote)ctx.lookup("LibrarySessionBean/remote");
         List<String> booksList1 = libraryBean1.getBooks();
         System.out.println(
            "***Using second lookup to get library stateless object***");
         System.out.println(
            "Book(s) entered so far: " + booksList1.size());
         for (int i = 0; i < booksList1.size(); ++i) {
            System.out.println((i+1)+". " + booksList1.get(i));
         }		 
      } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
      }finally {
         try {
            if(brConsoleReader !=null) {
               brConsoleReader.close();
            }
         } catch (IOException ex) {
            System.out.println(ex.getMessage());
         }
      }
   }
}

EJBTester esegue le seguenti attività:

  • Carica le proprietà da jndi.properties e inizializza l'oggetto InitialContext.

  • Nel metodo testStatelessEjb (), la ricerca jndi viene eseguita con nome - "LibrarySessionBean / remote" per ottenere l'oggetto business remoto (ejb senza stato).

  • Quindi all'utente viene mostrata l'interfaccia utente di un negozio della libreria e gli viene chiesto di inserire la scelta.

  • Se l'utente immette 1, il sistema richiede il nome del libro e salva il libro utilizzando il metodo addBook () del bean di sessione senza stato. Session Bean sta memorizzando il libro nella sua variabile di istanza.

  • Se l'utente immette 2, il sistema recupera i libri utilizzando il metodo getBooks () del bean di sessione senza stato ed esce.

  • Quindi viene eseguita un'altra ricerca jndi con il nome - "LibrarySessionBean / remote" per ottenere nuovamente l'oggetto business remoto (EJB senza stato) e l'elenco dei libri viene eseguito.

Eseguire il client per accedere a EJB

Individua EJBTester.java in Esplora progetti. Fare clic con il tasto destro sulla classe EJBTester e selezionarerun file.

Verificare il seguente output nella console Netbeans.

run:
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 1
Enter book name: Learn Java
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 1
1. Learn Java
***Using second lookup to get library stateless object***
Book(s) entered so far: 0
BUILD SUCCESSFUL (total time: 13 seconds)

Eseguire nuovamente il client per accedere a EJB

Individua EJBTester.java in Esplora progetti. Fare clic con il tasto destro sulla classe EJBTester e selezionarerun file.

Verificare il seguente output nella console Netbeans.

run:
**********************
Welcome to Book Store
**********************
Options 
1. Add Book
2. Exit 
Enter Choice: 2
Book(s) entered so far: 0
***Using second lookup to get library stateless object***
Book(s) entered so far: 1
1. Learn Java
BUILD SUCCESSFUL (total time: 12 seconds)
  • L'output mostrato sopra può variare, a seconda di quanti oggetti EJB senza stato vengono gestiti da JBoss.

  • Nel caso in cui venga mantenuto un singolo oggetto EJB senza stato, è possibile che venga visualizzato lo stesso elenco di libri dopo ogni ricerca.

  • Il contenitore EJB può restituire lo stesso oggetto EJB senza stato per ogni ricerca.

  • Il bean EJB senza stato mantiene il valore della variabile di istanza fino a quando il server non viene riavviato.