EJB_Y(由 EJB_X 调用)是否需要注释为“@Stateful”才能保证线程安全?

Does EJB_Y (called by EJB_X) need to be annotated as "@Stateful" in order to be thread safe?

前提:

  1. stateless EJB_X 包含对 EJB_Y 的注释引用(例如,“@EJB EJB_Y”)

  2. EJB_X需要在调用其业务方法前初始化EJB_Y

  3. 假设 EJB_X (a) 初始化然后随后 (b) 调用 EJB_Y 的业务方法 - 即 "multi-step"过程(?)

问题:

EJB_Y 是否需要注释为“@Stateful”才能保证线程安全?

注意:
否则 EJB_Y 只是一个简单的 POJO(例如,POJO_Y) - 但是,似乎为了使用日志记录“@Interceptor”class 访问方法参数 EJB_X对EJB_Y业务方法的调用,EJB_Y必须是EJB(?)...

其他信息:

一个。 EJB 3.1

b。 EJB_X 公开 REST 方法

c。目前降级为 WebLogic 12.1.3 运行 JDK 1.8.x

一个问题:

  1. EJB_X 初始化 EJB_Y 是什么意思?是初始化EJB的容器。

还有几点:

  1. EJB 公开休息服务是允许的,但从 Oracle 的角度来看,公开您的业务逻辑是一种 "quick and dirty" 应该在不久的将来重新审视的方法(我清楚地记得我的这个问题建筑师考试)。为了简化,EJB 应该是休息服务的后端,或者更好的是,Web 服务应该留在集成层。
  2. 一个无状态EJB和所有后续对其他无状态EJB的调用都是线程安全的,线程安全由容器(在本例中为weblogic)保证,无需使其成为stafeful。如果您在 EJB 世界中需要多线程,请寻找 @Singleton
  3. 顺便说一句,我一直觉得 Sun/Oracle 中的无状态和有状态这个词有点误导,如果英语允许的话,我从一开始就应该说无会话和有会话:-)

[更新]

从 SLSB 调用 SFSB 没有意义。最终你会得到不可预知的结果,只是因为 SLSB 的本质是生活在一个池中并在客户之间共享。您还将失去 SLSB 最重要的优势之一:可伸缩性。

我不太了解您的体系结构和设计,但我会通过摆脱前端 EJB 并构建 class 来重新访问 Web 服务层以充当 Web 服务(通过注释的使用)。然后,如果您想留在 EJB 世界,请在 EJB 调用上下文中传递所有数据,然后从 EJB 本身检索它。