EJB - Stateless Bean
Bezstanowy komponent bean sesji to typ komponentu bean przedsiębiorstwa, który jest zwykle używany do wykonywania niezależnych operacji. Bezstanowy komponent bean sesji, zgodnie z jego nazwą, nie ma skojarzonego stanu klienta, ale może zachować stan instancji. EJB Container zwykle tworzy pulę kilku bezstanowych obiektów bean i używa tych obiektów do przetwarzania żądań klienta. Ze względu na pulę nie ma gwarancji, że wartości zmiennych instancji będą takie same we wszystkich odnośnikach / wywołaniach metod.
Kroki tworzenia bezstanowego komponentu EJB
Poniżej przedstawiono kroki wymagane do utworzenia bezstanowego komponentu EJB -
Utwórz zdalny / lokalny interfejs ujawniający metody biznesowe.
Ten interfejs będzie używany przez aplikację kliencką EJB.
Użyj adnotacji @Local, jeśli klient EJB znajduje się w tym samym środowisku, w którym ma zostać wdrożony komponent bean sesji EJB.
Użyj adnotacji @Remote, jeśli klient EJB znajduje się w innym środowisku, w którym ma zostać wdrożony komponent bean sesji EJB.
Utwórz bezstanowy komponent bean sesji, implementując powyższy interfejs.
Użyj adnotacji @Stateless, aby oznaczyć, że jest to bean bezstanowy. EJB Container automatycznie tworzy odpowiednie konfiguracje lub interfejsy wymagane po przeczytaniu tej adnotacji podczas wdrażania.
Interfejs zdalny
import javax.ejb.Remote;
@Remote
public interface LibrarySessionBeanRemote {
//add business method declarations
}
Bezpaństwowy EJB
@Stateless
public class LibrarySessionBean implements LibrarySessionBeanRemote {
//implement business method
}
Przykładowa aplikacja
Utwórzmy testową aplikację EJB do testowania bezstanowego EJB.
Krok | Opis |
---|---|
1 | Utwórz projekt o nazwie EjbComponent w pakiecie com.tutorialspoint.stateless, jak wyjaśniono w rozdziale EJB - Tworzenie aplikacji . Możesz również użyć projektu utworzonego w rozdziale EJB - Tworzenie aplikacji jako takiego w tym rozdziale, aby zrozumieć koncepcje bezstanowego EJB. |
2 | Utwórz LibrarySessionBean.java i LibrarySessionBeanRemote, jak wyjaśniono w rozdziale EJB - tworzenie aplikacji . Resztę plików nie zmieniaj. |
3 | Wyczyść i skompiluj aplikację, aby upewnić się, że logika biznesowa działa zgodnie z wymaganiami. |
4 | Na koniec wdróż aplikację w postaci pliku jar na JBoss Application Server. Serwer aplikacji JBoss zostanie uruchomiony automatycznie, jeśli nie został jeszcze uruchomiony. |
5 | Teraz utwórz klienta EJB, aplikację opartą na konsoli w taki sam sposób, jak wyjaśniono w rozdziale EJB - Tworzenie aplikacji w temacieCreate Client to access EJB. |
EJBComponent (moduł 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;
}
}
Zaraz po wdrożeniu projektu EjbComponent w JBOSS zwróć uwagę na dziennik jboss.
JBoss automatycznie utworzył wpis JNDI dla naszego komponentu bean sesji - LibrarySessionBean/remote.
Będziemy używać tego ciągu wyszukiwania, aby uzyskać zdalny obiekt biznesowy typu - com.tutorialspoint.stateless.LibrarySessionBeanRemote
Dane wyjściowe dziennika serwera aplikacji JBoss
...
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 (klient 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
Te właściwości są używane do inicjowania obiektu InitialContext usługi nazewnictwa Java.
Obiekt InitialContext będzie używany do wyszukiwania bezstanowego komponentu bean sesji.
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 wykonuje następujące zadania -
Załaduj właściwości z jndi.properties i zainicjuj obiekt InitialContext.
W metodzie testStatelessEjb () wyszukiwanie jndi jest wykonywane z nazwą - „LibrarySessionBean / remote” w celu uzyskania zdalnego obiektu biznesowego (ejb bezstanu).
Następnie użytkownik widzi interfejs użytkownika sklepu biblioteki i jest proszony o wpisanie wyboru.
Jeśli użytkownik wprowadzi 1, system zapyta o nazwę książki i zapisze książkę przy użyciu metody bezstanowej sesji bean addBook (). Session Bean przechowuje książkę w zmiennej instancji.
Jeśli użytkownik wprowadzi 2, system pobierze książki za pomocą metody getBooks () bezstanowej sesji bean bean i zakończy działanie.
Następnie wykonywane jest kolejne wyszukiwanie jndi z nazwą - „LibrarySessionBean / remote”, aby ponownie uzyskać zdalny obiekt biznesowy (bezstanowy komponent EJB) i sporządzono listę książek.
Uruchom klienta, aby uzyskać dostęp do EJB
Znajdź EJBTester.java w eksploratorze projektów. Kliknij prawym przyciskiem myszy klasę EJBTester i wybierzrun file.
Sprawdź następujące dane wyjściowe w konsoli 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)
Uruchom klienta ponownie, aby uzyskać dostęp do EJB
Znajdź EJBTester.java w eksploratorze projektów. Kliknij prawym przyciskiem myszy klasę EJBTester i wybierzrun file.
Sprawdź następujące dane wyjściowe w konsoli 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)
Dane wyjściowe pokazane powyżej mogą się różnić w zależności od liczby bezstanowych obiektów EJB obsługiwanych przez JBoss.
W przypadku, gdy utrzymywany jest pojedynczy bezstanowy obiekt EJB, po każdym wyszukiwaniu może zostać wyświetlona ta sama lista książek.
Kontener EJB może zwracać ten sam bezstanowy obiekt EJB dla każdego wyszukiwania.
Bezstanowy komponent bean EJB przechowuje wartość zmiennej instancji do momentu ponownego uruchomienia serwera.