将无状态EJB注入已注释为Singleton的Web Service时的线程池

时间:2014-12-24 23:34:07

标签: java web-services singleton ejb-3.1

我正在审核一些代码,并对实施有一些疑问。此类作为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概念。对我的理解的任何输入/澄清都会有所帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

默认情况下,单例EJB为@ConcurrencyManagement(CONTAINER),方法为@Lock(WRITE),因此您只能从单个线程调用单例bean上的方法。但是,如果您使用@ConcurrencyManagement(BEAN)@Lock(READ),那么这将不再适用。无论如何,在你的例子中,如果单例会话bean是BImpl的唯一调用者,那么即使你的EJB服务器为无状态会话bean实现了池,它也只需要创建一个实例。

(请注意,虽然无状态会话bean可以有实例池,但它们没有线程池。应用程序服务器可能会使用线程池来处理入站请求,但它们与无状态会话bean或相关实例没有直接关联。)