是否可以在一个EJB 3 bean中共同使用@ WebService,@ Stateless和@Singleton?

时间:2011-10-21 13:01:06

标签: java annotations java-ee-6 ejb-3.1

我正在使用EJB 3和JBoss AS 6.0.0.Final。我有一个带有注释@Stateless@WebService的无状态会话bean。当我添加注释@Singleton时,部署错误显示消息:

  

... name = ServiceBean,service = ejb3已经安装

如何避免部署错误?

1 个答案:

答案 0 :(得分:4)

您可以在同一个bean中使用@WebService和@Stateless或@WebService和@Singleton,如果您希望将POJO公开为Web服务和EJB,则非常有意义。

在同一个bean中使用@Stateless和@Singleton没有多大意义。当您使用@Singleton时,您正在使用与@Stateless完全相同的所有EJB功能(事务管理,安全性等)创建EJB。唯一的区别是容器如何管理EJB生命周期:

  • @Stateless :在第一个请求之后立即创建EJB实例,当请求结束时,如果有另一个请求进入,则汇集EJB并准备好重用。但是,如果所有池化实例都是当另一个请求进入同一个bean时,容器会创建一个新实例,以便为该新请求提供服务。
  • @Singleton :在第一个请求(默认情况下 - 请参阅@Startup以覆盖此行为)之后创建EJB实例,这将是容器创建的唯一实例。如果另一个请求想要使用相同的EJB,容器将永远不会创建它的新实例 - 将使用先前创建的实例。它就像一个池大小为1的@Stateless EJB。在使用这些方面时,像并发这样的方面很重要,但这可能超出了这篇文章的范围。