5

Java EE 5EJB 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);  
   }
}

この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ただし、の新しいインスタンスが作成されるたびに。
2 回呼び出すことができます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 セッションで同じインスタンスが必要です

web.xml でのサーブレット マッピング

   <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 の同じインスタンスを返すとは述べていません。反対に、すべてのクライアントがサーバー上で独自のインスタンスを取得することを保証するために、サーバーが 2 つの異なるインスタンスを作成することさえ必要です。

EJB 仕様では、ステートフル セッション Bean を参照している間は、複数のメソッド呼び出しにわたって内部状態が保持されるとだけ述べられています。

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

これは、ステートレス セッション Bean を使用する場合には当てはまらないことに注意してください。ここで、上記の 2 つのメソッド呼び出しは、サーバー上の異なるインスタンスに送られる可能性があります。

于 2013-11-11T10:45:21.583 に答える