首页 > 解决方案 > EJB:了解容器如何选择 bean

问题描述

我试图了解 statefull bean 的工作原理(我阅读了理论部分并且我知道 statfull 和 statelss bean 之间的区别......),因此我创建了一个 statefull bean 和一个 rest API 来访问它。
我发现容器为每个请求创建/实例化一个新bean。
然后我使用了一个 servlet 来访问同一个 statfull bean,这一次容器只创建了一个bean 来服务所有请求。
所以我的问题是:

  1. 为什么容器会为 rest API 创建许多 bean?我知道它将每个请求视为一个单独的客户端,但它是如何知道的,因为使用 http 请求访问了 rest API 或 servlet?
  2. 为什么将来自servlet的请求视为一个客户端?(因此它创建一个 bean)
  3. 就我而言(在本地进行测试)如何在使用 servlet 时强制容器创建更多的 bean(如何模拟多个客户端)。

先感谢您

标签: javaservletsejb

解决方案


我检查了规格,但找不到有关此的内容。但这似乎是合理的:

必须有人照顾 SFSB 实例,完成后关闭它。

将 SFSB 的 EJB 业务方法公开为 REST 服务时,将使用通用 servlet。唯一可用的范围是单个(无状态)HTTP 调用的请求范围,因此在调用完成后,通用 servlet 应该关闭 SFSB。

servlet 有一个明确的生命周期。注入的 EJB 是在 servlet 初始化期间创建的,并且可以在销毁时关闭。

您可以在创建每个 HTTP 会话时查找新的 SFSB 实例,使用会话上下文对该会话进行后续调用,并在匹配会话关闭时关闭 SFSB。


推荐阅读