Сессионный компонент с состоянием — это тип корпоративного компонента, который сохраняет диалоговое состояние с клиентом. Сессионный компонент с сохранением состояния согласно своему имени сохраняет связанное состояние клиента в своих переменных экземпляра. Контейнер EJB создает отдельный сессионный компонент с сохранением состояния для обработки каждого запроса клиента. Как только закончится область запроса, сессионный компонент с сохранением состояния уничтожается.
Шаги для создания Stateful EJB
Ниже приведены шаги, необходимые для создания EJB с состоянием:
-
Создайте удаленный / локальный интерфейс, раскрывающий бизнес-методы.
-
Этот интерфейс будет использоваться клиентским приложением EJB.
-
Используйте аннотацию @Local, если клиент EJB находится в той же среде, где необходимо развернуть сессионный компонент EJB.
-
Используйте аннотацию @Remote, если клиент EJB находится в другой среде, где требуется развернуть сессионный компонент EJB.
-
Создайте сессионный компонент с сохранением состояния, реализуя вышеуказанный интерфейс.
-
Используйте аннотацию @Stateful, чтобы обозначить ее как компонент с состоянием. Контейнер EJB автоматически создает соответствующие конфигурации или интерфейсы, необходимые для чтения этой аннотации во время развертывания.
Создайте удаленный / локальный интерфейс, раскрывающий бизнес-методы.
Этот интерфейс будет использоваться клиентским приложением EJB.
Используйте аннотацию @Local, если клиент EJB находится в той же среде, где необходимо развернуть сессионный компонент EJB.
Используйте аннотацию @Remote, если клиент EJB находится в другой среде, где требуется развернуть сессионный компонент EJB.
Создайте сессионный компонент с сохранением состояния, реализуя вышеуказанный интерфейс.
Используйте аннотацию @Stateful, чтобы обозначить ее как компонент с состоянием. Контейнер EJB автоматически создает соответствующие конфигурации или интерфейсы, необходимые для чтения этой аннотации во время развертывания.
Удаленный интерфейс
import javax.ejb.Remote; @Remote public interface LibraryStatefulSessionBeanRemote { //add business method declarations }
Stateful EJB
@Stateful public class LibraryStatefulSessionBean implements LibraryStatefulSessionBeanRemote { //implement business method }
Пример приложения
Давайте создадим тестовое EJB-приложение для тестирования EJB с отслеживанием состояния.
шаг | Описание |
---|---|
1 |
Создайте проект с именем EjbComponent в пакете com.tutorialspoint.stateful, как описано в главе EJB — Создание приложения . Вы также можете использовать проект, созданный в главе EJB — Создание приложения как таковой, для понимания концепций EJB с состоянием. |
2 |
Создайте LibraryStatefulSessionBean.java и LibraryStatefulSessionBeanRemote, как описано в главе EJB — Создание приложения . Сохраните остальные файлы без изменений. |
3 |
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями. |
4 |
Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен. |
5 |
Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» . |
Создайте проект с именем EjbComponent в пакете com.tutorialspoint.stateful, как описано в главе EJB — Создание приложения . Вы также можете использовать проект, созданный в главе EJB — Создание приложения как таковой, для понимания концепций EJB с состоянием.
Создайте LibraryStatefulSessionBean.java и LibraryStatefulSessionBeanRemote, как описано в главе EJB — Создание приложения . Сохраните остальные файлы без изменений.
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.
Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен.
Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» .
EJBComponent (модуль EJB)
LibraryStatefulSessionBeanRemote.java
package com.tutorialspoint.stateful; import java.util.List; import javax.ejb.Remote; @Remote public interface LibraryStatefulSessionBeanRemote { void addBook(String bookName); List getBooks(); }
LibraryStatefulSessionBean.java
package com.tutorialspoint.stateful; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateful; @Stateful public class LibraryStatefulSessionBean implements LibraryStatefulSessionBeanRemote { List<String> bookShelf; public LibraryStatefulSessionBean() { bookShelf = new ArrayList<String>(); } public void addBook(String bookName) { bookShelf.add(bookName); } public List<String> getBooks() { return bookShelf; } }
-
Как только вы развернете проект EjbComponent в JBOSS, обратите внимание на журнал jboss.
-
JBoss автоматически создал запись JNDI для нашего сессионного компонента — LibraryStatefulSessionBean / remote .
-
Мы будем использовать эту строку поиска для получения удаленного бизнес-объекта типа — com.tutorialspoint.stateful.LibraryStatefulSessionBeanRemote
Как только вы развернете проект EjbComponent в JBOSS, обратите внимание на журнал jboss.
JBoss автоматически создал запись JNDI для нашего сессионного компонента — LibraryStatefulSessionBean / remote .
Мы будем использовать эту строку поиска для получения удаленного бизнес-объекта типа — com.tutorialspoint.stateful.LibraryStatefulSessionBeanRemote
Вывод журнала сервера приложений JBoss
... 16:30:01,401 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: LibraryStatefulSessionBean/remote - EJB3.x Default Remote Business Interface LibraryStatefulSessionBean/remote-com.tutorialspoint.stateful.LibraryStatefulSessionBeanRemote - EJB3.x Remote Business Interface 16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryStatefulSessionBean,service=EJB3 16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.stateful.LibraryStatefulSessionBeanRemote ejbName: LibraryStatefulSessionBean 16:30:02,731 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: LibraryStatefulSessionBean/remote - EJB3.x Default Remote Business Interface LibraryStatefulSessionBean/remote-com.tutorialspoint.stateful.LibraryStatefulSessionBeanRemote - EJB3.x Remote Business Interface ...
EJBTester (клиент 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
-
Эти свойства используются для инициализации объекта InitialContext сервиса именования java.
-
Объект InitialContext будет использоваться для поиска сессионного компонента с сохранением состояния.
Эти свойства используются для инициализации объекта InitialContext сервиса именования java.
Объект InitialContext будет использоваться для поиска сессионного компонента с сохранением состояния.
EJBTester.java
package com.tutorialspoint.test; import com.tutorialspoint.stateful.LibraryStatefulSessionBeanRemote; 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; LibraryStatefulSessionBeanRemote libraryBean = LibraryStatefulSessionBeanRemote)ctx.lookup("LibraryStatefulSessionBean/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++; } LibraryStatefulSessionBeanRemote libraryBean1 = (LibraryStatefulSessionBeanRemote)ctx.lookup("LibraryStatefulSessionBean/remote"); List<String> booksList1 = libraryBean1.getBooks(); System.out.println( "***Using second lookup to get library stateful 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 выполняет следующие задачи —
-
Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.
-
В методе testStatefulEjb () поиск jndi выполняется с именем — «LibraryStatefulSessionBean / remote» для получения удаленного бизнес-объекта (stateful ejb).
-
Затем пользователю показывается пользовательский интерфейс хранилища библиотеки, и ему / ей предлагается ввести выбор.
-
Если пользователь вводит 1, система запрашивает имя книги и сохраняет книгу, используя метод addBook () сессионного компонента с состоянием. Сессионный компонент хранит книгу в своей переменной экземпляра.
-
Если пользователь вводит 2, система получает книги, используя метод getBooks () сессионного компонента с состоянием, и завершает работу.
-
Затем выполняется другой поиск jndi с именем — «LibraryStatefulSessionBean / remote», чтобы снова получить удаленный бизнес-объект (EJB с сохранением состояния) и составить список книг.
Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.
В методе testStatefulEjb () поиск jndi выполняется с именем — «LibraryStatefulSessionBean / remote» для получения удаленного бизнес-объекта (stateful ejb).
Затем пользователю показывается пользовательский интерфейс хранилища библиотеки, и ему / ей предлагается ввести выбор.
Если пользователь вводит 1, система запрашивает имя книги и сохраняет книгу, используя метод addBook () сессионного компонента с состоянием. Сессионный компонент хранит книгу в своей переменной экземпляра.
Если пользователь вводит 2, система получает книги, используя метод getBooks () сессионного компонента с состоянием, и завершает работу.
Затем выполняется другой поиск jndi с именем — «LibraryStatefulSessionBean / remote», чтобы снова получить удаленный бизнес-объект (EJB с сохранением состояния) и составить список книг.
Запустите клиент для доступа к EJB
Найдите EJBTester.java в проводнике проекта. Щелкните правой кнопкой мыши класс EJBTester и выберите файл запуска .
Проверьте следующий вывод в консоли 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 stateful object*** Book(s) entered so far: 0 BUILD SUCCESSFUL (total time: 13 seconds)
Снова запустите клиент для доступа к EJB
Найдите EJBTester.java в проводнике проекта. Щелкните правой кнопкой мыши класс EJBTester и выберите файл запуска .
Проверьте следующий вывод в консоли Netbeans.
Вывод, показанный выше, гласит, что для каждого поиска возвращается отдельный экземпляр EJB с состоянием.
EJB-объект с состоянием сохраняет значение только для одного сеанса. Как и во втором запуске, мы не получаем никакой ценности книг.