Java,无状态会话bean

gam*_*ver 4 java java-ee ejb-3.0

无状态会话bean不维护状态.那么这是否意味着它们不应该有实例变量?

谢谢,
罗杰

cle*_*tus 9

在这种情况下,"国家"一词有点误导.它所指的是会话状态,这意味着如果客户端进行多次调用,则会话bean无法知道.想象一下一系列的调用:

  • reserveSeatsOnFlight();
  • chooseMealPreference();
  • confirmBooking().

你所拥有的是会话状态,这意味着第二次调用必须与第一次调用相同的bean进行,否则它就没有意义.这就是有状态会话bean的作用.

无状态会话bean可以有实例变量,但这些变量基本上是全局变量.如果您有一个无状态会话bean池(您可能会或可能不会取决于容器决定要做什么),那么这些实例变量可能会也可能不存在从一个调用到下一个调用.所以一般避免实例变量.这种事情还有其他机制.

让我给你举个例子.想象一下这个无状态会话bean的调用:

public void bookFlight(List<Passsenger> passengers, FlightNumber flight, Date date) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果您输入一个实例变量来计算预订数量并在每次调用时递增它,那么后续调用可能会调用不同的bean,因此会看到不同的值.这就是我的意思,它不一定有意义.

回到第一个例子,处理这个问题的一种方法是将状态传递给调用者:

public interface ReservationSystem {
  public int createNewBooking();
  public int reserveSeatsOnFlight(int bookingId, int seats);
  public int chooseMealPreference(int bookingId, ...)
  ...
}
Run Code Online (Sandbox Code Playgroud)

看看上面的内容如何不再具有会话状态?它确实如此,但它现在封装在bookingId你传递的内容中.无状态会话bean可以检索预订并从另一个停止的地方继续.