【发布时间】:2014-02-23 21:17:08
【问题描述】:
我是 ejbs 的新手。我写了一个作用域为@SessionScoped 的有状态会话bean。然后我将 ejb 注入到我的 servlet 中。
@Local
@SessionScoped
@Statueful
public class CartServiceImpl implements CartService {
private int i = 0;
public int getI() {
return i++;
}
}
在我的 servlet 中
@Inject
private CartService cartService;
.
.
.
out.print(cartService.getI());
然后我打开了两个浏览器(IE、FF)并点击了 servlet。在 IE 中,我看到从 0 到 n 的输出。在 Firefox 中,我也看到从 0 到 n 的输出。
然后我创建了一个耳朵,它有一个罐子和一个战争。 jar 包含所有 ejb。 war 包含 servlet。
这就是我将 ejb 注入 servlet 的方式
@Resource(lookup = "java:app/ejb-beginner-ejb/CartServiceImpl")
private CartService cartService;
然后我尝试从 IE 和 FF 请求相同的 servlet,但得到了意外的输出。
输出如下
在 IE 中我第一次请求,我得到 0 作为输出。然后我刷新了页面,我得到 1 作为输出。然后我转到 FF,第一次发送请求,我得到 2 作为输出而不是 0。然后我转到 IE 并刷新页面,我得到 3 作为输出而不是 2。
我的理解是应用服务器只创建了一个有状态 ejb 的实例。我该如何解决这个问题?
war中打包ejb和单独打包到jar模块有什么区别?
【问题讨论】:
-
有趣。显然,当您将其打包为战争的一部分时,会话范围的字面意思是 HTTP 会话的一部分,而当您将其打包在 EJB 模块中时,这当然不再与任何 HTTP 会话相关,并且显然是基于 IP 进行管理的的客户。无论如何,这就是我从您的测试结果中得出的结论。有状态的 bean 对我来说是神秘的野兽。
-
好的。在这种情况下,有状态会话 bean 什么时候到期?有状态会话bean与http会话绑定时,客户端一终止就过期(例如关闭浏览器) 万一http会话没有绑定,有状态会话bean使用客户端的ip,什么时候删除/终止?是客户端更改他的IP时吗?是客户端重启机器的时候吗?
-
如果你发现了,请告诉我!
标签: java jakarta-ee ejb ejb-3.0 stateful-session-bean