Jakarta ee 无状态EJB线程问题

Jakarta ee 无状态EJB线程问题,jakarta-ee,thread-safety,ejb,pool,Jakarta Ee,Thread Safety,Ejb,Pool,考虑以下两个EJB: @Stateless public class MyBean1 { pulic void method1() { //method implementation comes here } pulic void method2() { //method implementation comes here } } @Stateless public class MyBean2 { @EJB

考虑以下两个EJB:

@Stateless
public class MyBean1 {

    pulic void method1() {
        //method implementation comes here
    }

    pulic void method2() {
        //method implementation comes here
    } 
}


@Stateless
public class MyBean2 {

    @EJB
    MyBean1 myBean1;

    public void businessMethod() {
        myBean1.method1();
        myBean1.method2();
    }
}

容器是否会保证在MyBean1的相同实例上调用这两个方法(并且在该实例上的两个方法调用之间不会调用其他方法)?

您无法判断是否可以访问同一实例。由集装箱决定

即使您“认为”它是同一个实例(例如,代码中的一个
@EJB MyBean1
),这些调用可能会命中不同的
MyBean
实例

EJB的其他业务方法可能会在
myBean1.method1()
myBean1.method2()调用之间调用。例如,这可能是从不同的组件调用EJB

然而,这应该不会让您太感兴趣,因为您使用的是无状态EJB,也就是说,您不应该在EJB中存储任何状态。

因此,无论是获得相同或不同的EJB实例,还是其他组件在调用之间调用相同类型的EJB上的业务方法,都不应引起关注。

那么,“无状态会话bean是线程安全的”到底是什么意思呢?这意味着不超过一个线程将访问给定EJB实例的任何业务方法。这是线程安全。如果您开始担心对EJB组件的不同调用,这意味着它不是无状态的,不应该这样定义。