无状态会话bean维护状态

时间:2014-05-02 04:44:31

标签: ejb-3.0 httpsession stateless-session-bean

我在localhost GlassFish服务器上部署了一个Web应用程序。此应用程序从用户获取订单信息并将其存储在无状态会话Bean中的List类型变量中。列表对象在构造函数中创建。

我打开订单页面并在其中添加多个订单。当我在不同选项卡和不同浏览器中打开show orders页面时,它会正确显示所有订单信息bean,就好像状态是在无状态Bean中维护一样!

我认为这种行为是错误的,因为每个浏览器/标签应该与服务器创建不同的会话,并且应该为每个浏览器/标签显示新的订单信息。如何解释这种行为?

2 个答案:

答案 0 :(得分:1)

您的用例正是有状态会话bean的用途,如果您希望跨方法调用维护List对象,并且您希望为每个会话分配自己的bean。

无状态会话bean汇集在一起​​并可供任何会话使用。但是不保证您的实例字段被清除,因此您不能依赖它们被清除。您看到的行为并非出乎意料。即使您成功地在多个选项卡中创建了单独的会话,这些会话也很可能(并且显然是)被分配了相同的会话bean。那是因为相关的方法调用发生在不同的时间点。现在,如果相关的方法调用同时发生,那么平台将为每个调用(会话)分配不同的无状态bean。在这种情况下,你会看到不同的行为。

另见;

conversational state of session beans

Stateless and Stateful Enterprise Java Beans


永远不要让你不能做的事情妨碍你做什么。

答案 1 :(得分:0)

问题:有状态会话Bean没有为每个客户端维护单独的状态。在我尝试的示例中,我从JSP页面输入订单,这些订单存储在有状态会话Bean中的List中。当我从不同的浏览器(即不同的会话)调用相同的URL时,在前一个会话中输入的订单列表是可见的。两个会话中都引用了相同的EJB。 (由sysouts验证)

就像说,其他一些用户的购物车对我来说直接可见,好像他们是我的订单!!

解决方案:使用HttpSessionListener并通过sessionCreated(HttpSessionEvent se)方法通过JNDI获取有状态EJB的依赖关系。接下来,在HttpSession中添加有状态EJB,并通过servlet中的会话访问EJB。

在上面的答案中给出了使用JNDI而不是DI来建议有状态会话Bean和将EJB添加到HttpSession的建议。不知道这是否是正确的方法,但它有效!!