java - EJB_Y(由EJB_X调用)是否需要注释为 "@Stateful"才能线程安全?

标签 java cdi ejb-3.1 weblogic12c

前提:

  1. 无状态 EJB_X 包含对 EJB_Y 的带注释的引用(例如“@EJB EJB_Y”)

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

  3. 假设 EJB_X (a) 初始化,然后 (b) 调用 EJB_Y 的业务方法 - 即“多步骤”过程(?)

问题:

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

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

其他信息:

a. EJB 3.1

b. EJB_X 公开 REST 方法

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

最佳答案

一个问题:

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

还有几点:

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

[更新]

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

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

关于java - EJB_Y(由EJB_X调用)是否需要注释为 "@Stateful"才能线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39921267/

相关文章:

java - 带有 <path>/</path> 和 JSESSIONID 的 cookie

java - 如何使用Java在Android GridLayout中设置间距?

java - 在 ResourceContext initResource 创建的 JAX-RS 子资源实例中不可能进行 CDI 注入(inject)

java - @Inject 注释不起作用

jakarta-ee - 当transaction属性为 "Required"时,为什么CMT在EJB方法的退出时提交?

java - Spring data couchbase 3.0.9 发布 - com.couchbase.client.java.error.ViewDoesNotExistException 查看人员/全部不存在

java - 如何从maven项目返回网页

java - Java EE CDI 的真正好处

java - 当 ejb-jar.xml 存在时,EJB3 注释将被忽略

ejb - 无法访问作为 REST 服务公开的 EJB