Учебники

EJB — бин без гражданства

Сессионный компонент без сохранения состояния — это тип корпоративного компонента, который обычно используется для выполнения независимых операций. Сессионный компонент без сохранения состояния согласно его имени не имеет никакого связанного состояния клиента, но он может сохранить свое состояние экземпляра. Контейнер EJB обычно создает пул из нескольких объектов bean-объектов без сохранения состояния и использует эти объекты для обработки запроса клиента. Из-за пула значения переменных экземпляров не гарантируются одинаковыми при поиске / вызове метода.

Шаги по созданию EJB без сохранения состояния

Ниже приведены шаги, необходимые для создания EJB без сохранения состояния.

  • Создайте удаленный / локальный интерфейс, раскрывающий бизнес-методы.

  • Этот интерфейс будет использоваться клиентским приложением EJB.

  • Используйте аннотацию @Local, если клиент EJB находится в той же среде, где должен быть развернут сессионный компонент EJB.

  • Используйте аннотацию @Remote, если клиент EJB находится в другой среде, в которой должен быть развернут сессионный компонент EJB.

  • Создайте сессионный компонент без сохранения состояния, реализуя описанный выше интерфейс.

  • Используйте аннотацию @Stateless, чтобы обозначить ее как компонент без состояния. Контейнер EJB автоматически создает соответствующие конфигурации или интерфейсы, необходимые для чтения этой аннотации во время развертывания.

Создайте удаленный / локальный интерфейс, раскрывающий бизнес-методы.

Этот интерфейс будет использоваться клиентским приложением EJB.

Используйте аннотацию @Local, если клиент EJB находится в той же среде, где должен быть развернут сессионный компонент EJB.

Используйте аннотацию @Remote, если клиент EJB находится в другой среде, в которой должен быть развернут сессионный компонент EJB.

Создайте сессионный компонент без сохранения состояния, реализуя описанный выше интерфейс.

Используйте аннотацию @Stateless, чтобы обозначить ее как компонент без состояния. Контейнер EJB автоматически создает соответствующие конфигурации или интерфейсы, необходимые для чтения этой аннотации во время развертывания.

Удаленный интерфейс

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

EJB без гражданства

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

Пример приложения

Давайте создадим тестовое EJB-приложение для тестирования EJB без сохранения состояния.

шаг Описание
1

Создайте проект с именем EjbComponent в пакете com.tutorialspoint.stateless, как описано в главе EJB — Создание приложения . Вы также можете использовать проект, созданный в главе EJB — Создание приложения как таковой, для понимания концепций EJB без сохранения состояния.

2

Создайте LibrarySessionBean.java и LibrarySessionBeanRemote, как описано в главе EJB — Создание приложения . Сохраните остальные файлы без изменений.

3

Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.

4

Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен.

5

Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» .

Создайте проект с именем EjbComponent в пакете com.tutorialspoint.stateless, как описано в главе EJB — Создание приложения . Вы также можете использовать проект, созданный в главе EJB — Создание приложения как таковой, для понимания концепций EJB без сохранения состояния.

Создайте LibrarySessionBean.java и LibrarySessionBeanRemote, как описано в главе EJB — Создание приложения . Сохраните остальные файлы без изменений.

Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.

Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен.

Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» .

EJBComponent (модуль 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;
   }
}
  • Как только вы развернете проект EjbComponent в JBOSS, обратите внимание на журнал jboss.

  • JBoss автоматически создал запись JNDI для нашего сессионного компонента — LibrarySessionBean / remote .

  • Мы будем использовать эту строку поиска для получения удаленного бизнес-объекта типа — com.tutorialspoint.stateless.LibrarySessionBeanRemote

Как только вы развернете проект EjbComponent в JBOSS, обратите внимание на журнал jboss.

JBoss автоматически создал запись JNDI для нашего сессионного компонента — LibrarySessionBean / remote .

Мы будем использовать эту строку поиска для получения удаленного бизнес-объекта типа — com.tutorialspoint.stateless.LibrarySessionBeanRemote

Вывод журнала сервера приложений 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 (клиент 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.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 выполняет следующие задачи —

  • Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.

  • В методе testStatelessEjb () поиск jndi выполняется с именем — «LibrarySessionBean / remote» для получения удаленного бизнес-объекта (ejb без сохранения состояния).

  • Затем пользователю показывается пользовательский интерфейс магазина библиотеки, и ему / ей предлагается ввести выбор.

  • Если пользователь вводит 1, система запрашивает имя книги и сохраняет книгу, используя метод addBook () сессионного компонента без сохранения состояния. Сессионный компонент хранит книгу в своей переменной экземпляра.

  • Если пользователь вводит 2, система получает книги, используя метод getBooks () сессионного компонента без сохранения состояния, и завершает работу.

  • Затем выполняется другой поиск jndi с именем — «LibrarySessionBean / remote» для повторного получения удаленного бизнес-объекта (EJB без сохранения состояния) и составления списка книг.

Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.

В методе testStatelessEjb () поиск jndi выполняется с именем — «LibrarySessionBean / remote» для получения удаленного бизнес-объекта (ejb без сохранения состояния).

Затем пользователю показывается пользовательский интерфейс магазина библиотеки, и ему / ей предлагается ввести выбор.

Если пользователь вводит 1, система запрашивает имя книги и сохраняет книгу, используя метод addBook () сессионного компонента без сохранения состояния. Сессионный компонент хранит книгу в своей переменной экземпляра.

Если пользователь вводит 2, система получает книги, используя метод getBooks () сессионного компонента без сохранения состояния, и завершает работу.

Затем выполняется другой поиск jndi с именем — «LibrarySessionBean / 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 stateless object***
Book(s) entered so far: 0
BUILD SUCCESSFUL (total time: 13 seconds)

Снова запустите клиент для доступа к EJB

Найдите EJBTester.java в проводнике проекта. Щелкните правой кнопкой мыши класс EJBTester и выберите файл запуска .

Проверьте следующий вывод в консоли Netbeans.

Вывод, показанный выше, может варьироваться в зависимости от того, сколько объектов EJB без состояния поддерживает JBoss.

В случае, если поддерживается один объект EJB без сохранения состояния, вы можете увидеть один и тот же список книг после каждого поиска.

Контейнер EJB может возвращать один и тот же объект EJB без сохранения состояния для каждого поиска.

EJB-компонент без сохранения состояния сохраняет значение переменной экземпляра до тех пор, пока сервер не будет перезапущен.