5

我正在使用Java EE 5, EJB 3.0, Jboss AS 4.3.2.
我有最简单的Stateful豆子

@Local
public interface IStateBean 
{
}
@Stateful
public class StateBean implements IStateBean
{  
   private static int number = 0;

   @PostConstruct
   void init()
   {
      number++;
      System.out.println("@PostConstruct: " + number);
   }

   @PreDestroy
   void destroy()
   {
      number--;
      System.out.println("@PreDestroy: " + number);  
   }
}

我在 servlet 中查找这个 bean

public class MyServlet extends HttpServlet
{  
   @Override
   public void doGet(final HttpServletRequest aRequest, final HttpServletResponse aResponse) throws ServletException, IOException
   {  
      IStateBean bean = new InitialContext().lookup("app-ear/StateBean/local");
      // ...
   }
}  

但是每次StateBean创建新实例时。
我可以调用两次,但会再次创建 lookup新的实例StateBean

   @Override
   public void doGet(final HttpServletRequest aRequest, final HttpServletResponse aResponse) throws ServletException, IOException
   {  
      IStateBean bean1 = new InitialContext().lookup("app-ear/StateBean/local"); 
      IStateBean bean2 = new InitialContext().lookup("app-ear/StateBean/local"); // new instance is created
      // ...
   }  

我希望在同一个 http-session 中有同一个实例

web.xml 中的 Servlet 映射

   <servlet>
      <servlet-name>MyServlet</servlet-name>
      <servlet-class>com.package.MyServlet</servlet-class>
   </servlet>  
   <servlet-mapping>
      <servlet-name>MyServlet</servlet-name>
      <url-pattern>*.html</url-pattern>
   </servlet-mapping>
4

1 回答 1

9

EJB 规范并没有说多次查找将返回同一个有状态会话 bean 的实例。相反:服务器甚至需要创建两个不同的实例,以保证每个客户端都在服务器上获得自己的实例。

EJB 规范只说,当您引用有状态会话 bean 时,它会在多个方法调用中保留其内部状态:

IStateBean bean = new InitialContext().lookup("app-ear/StateBean/local");
bean.myMethod1();
bean.myMethod2(); // affects the same EJB instance on the server

请注意,使用无状态会话 bean 时可能不是这种情况。在这里,上面显示的两个方法调用可能会转到服务器上的不同实例!

于 2013-11-11T10:45:21.583 回答