我正在审核一些代码,并对实施有一些疑问。此类作为Web服务公开,并注释为单例。将无状态EJB注入此类。这就是代码的样子:
@Singleton
@Webservice
public class AImpl implements A, ARemote {
:
:
@EJB
private B b;
@WebMethod
public String someWebService(){
String value = this.b.someMethod();
return value;
}
}
以下是B的定义:
@Local
public interface B {
public String someMethod();
}
@Stateless(mappedName="B")
public class BImpl implements B, BRemote {
public String someMethod() {
// do something
}
}
我的问题: 由于webservice是Singleton,因此只有一个实例。将只有一个主题(如果我在这里错了,请纠正我)。虽然B能够拥有一个线程池,因为它是无状态的,但是它被称为单例的Web服务是否重要。
我目前正在学习EJB概念。对我的理解的任何输入/澄清都会有所帮助。
感谢。
答案 0 :(得分:0)
默认情况下,单例EJB为@ConcurrencyManagement(CONTAINER)
,方法为@Lock(WRITE)
,因此您只能从单个线程调用单例bean上的方法。但是,如果您使用@ConcurrencyManagement(BEAN)
或@Lock(READ)
,那么这将不再适用。无论如何,在你的例子中,如果单例会话bean是BImpl
的唯一调用者,那么即使你的EJB服务器为无状态会话bean实现了池,它也只需要创建一个实例。
(请注意,虽然无状态会话bean可以有实例池,但它们没有线程池。应用程序服务器可能会使用线程池来处理入站请求,但它们与无状态会话bean或相关实例没有直接关联。)