Jakarta ee 无状态EJB线程问题
考虑以下两个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
@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组件的不同调用,这意味着它不是无状态的,不应该这样定义。