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

时间:2016-10-07 15:50:16

标签: 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的业务方法 - 即“多步”过程(?)

  4. 问题:

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

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

    其他信息:

    一个。 EJB 3.1

    湾EJB_X公开了REST方法

    ℃。目前已降级为运行JDK 1.8.x的WebLogic 12.1.3

1 个答案:

答案 0 :(得分:1)

一个问题:

  1. EJB_X初始化EJB_Y是什么意思?它是初始化EJB的容器。
  2. 还有几点:

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

      从SLSB调用SFSB没有意义。最后,您将获得不可预测的结果,这仅仅是因为生活在游泳池中并在客户之间共享的SLSB的性质。您还将失去SLSB最重要的好处之一:可扩展性。

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