• 雷林鹏分享:EJB无状态Bean


      无状态会话bean是一种企业bean,通常是用于执行独立操作。正如它的名字一样,无状态会话bean不具有任何关联的客户端的状态,但它可能会保持其实例的状态。 EJB容器通常创建一个容器池和几无状态的bean的对象,并使用这些对象来处理客户端的请求。由于有容器池,实例变量的值不能保证跨查找/方法调用同一个。

      下面是创建一个无状态的EJB所需的步骤。

      创建一个远程/本地接口暴露的业务方法。

      此接口将用于EJB客户端应用程序。

      使用@ Local注释如果EJB客户端是在相同的环境中部署EJB会话Bean。

      使用@ Remote批注如果EJB客户端是在不同的环境中部署EJB会话Bean。

      创建一个无状态会话bean实现上述接口。

      使用@ Stateless注释,以表示它一个无状态的bean。 EJB容器会自动创建通过读取这个注解,在部署过程中的相关配置或接口。

      Remote Interface

      import javax.ejb.Remote;

      @Remote

      public interface LibrarySessionBeanRemote {

      //add business method declarations

      }

      Stateless EJB

      @Stateless

      public class LibrarySessionBean implements LibrarySessionBeanRemote {

      //implement business method

      }

      示例应用程序

      让我们创建一个测试测试无状态EJB的EJB应用程序。

      步骤描述

      1Create a project with a name EjbComponent under a package com.tutorialspoint.stateless as explained in the EJB - Create Application chapter. You can also use the project created in EJB - Create Application chapter as such for this chapter to understand stateless ejb concepts.

      2Create LibrarySessionBean.java and LibrarySessionBeanRemote as explained in the EJB - Create Application chapter. Keep rest of the files unchanged.

      3Clean and Build the application to make sure business logic is working as per the requirements.

      4Finally, deploy the application in the form of jar file on JBoss Application Server. JBoss Application server will get started automatically if it is not started yet.

      5Now create the ejb client, a console based application in the same way as explained in theEJB - Create Application chapter under topic Create Client to access EJB.

      EJBComponent (EJB Module)

      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 bookShelf;

      public LibrarySessionBean(){

      bookShelf = new ArrayList();

      }

      public void addBook(String bookName) {

      bookShelf.add(bookName);

      }

      public List getBooks() {

      return bookShelf;

      }

      }

      As soon as you deploy the EjbComponent project on JBOSS, notice the jboss log.

      JBoss has automatically created a JNDI entry for our session bean -LibrarySessionBean/remote.

      We'll using this lookup string to get remote business object of type -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 Client)

      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

      These properties are used to initialize the InitialContext object of java naming service

      InitialContext object will be used to lookup stateless session bean

      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

      1. Add Book

      2. Exit

      Enter 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 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 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在执行以下任务。

      Load properties from jndi.properties and initialize the InitialContext object.

      In testStatelessEjb() method, jndi lookup is done with name - "LibrarySessionBean/remote" to obtain the remote business object (stateless ejb).

      Then user is shown a library store User Interface and he/she is asked to enter choice.

      If user enters 1, system asks for book name and saves the book using stateless session bean addBook() method. Session Bean is storing the book in its instance variable.

      If user enters 2, system retrieves books using stateless session bean getBooks() method and exits.

      Then another jndi lookup is done with name - "LibrarySessionBean/remote" to obtain the remote business object (stateless ejb) again and listing of books is done.

      运行客户端访问EJB

      Locate EJBTester.java in project explorer. Right click on EJBTester class and select run file.

      Verify the following output in Netbeans console.

      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类,并选择run file.

      在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)

      如上图所示的输出可能会有所不同,这取决于许多无状态JBoss的EJB对象保持。

      万一单一的无状态EJB对象得以维持,每次查找后,你可能会看到相同书籍列表。

      EJB容器可以为每个查询返回相同的无状态EJB对象。

      无状态EJB的bean实例变量的值是直到重新启动服务器才失效的。(编辑:雷林鹏 来源:网络|侵删)

  • 相关阅读:
    Java集合框架
    常见异常--被解码的 URI 不是合法的编码
    BigDecimal使用以及异常处理
    文章标题--再识HTML5
    【转】解决$Proxy0 cannot be cast to java.sql.Connection异常
    Response-->cookie的添加和删除
    自定义标签---TLD约束文件格式说明
    XML约束文件---DTD文件
    JavaScript——注册表单参考模板(含参数格式校验)
    java的可序列化(转载)
  • 原文地址:https://www.cnblogs.com/pengpeng1208/p/13050493.html
Copyright © 2020-2023  润新知