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

发布于 2024-12-10 22:51:40 字数 251 浏览 0 评论 0原文

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

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

如何避免部署错误?

I'm using EJB 3 and JBoss AS 6.0.0.Final. I have a stateless session bean with the annotations @Stateless and @WebService. When I add the annotation @Singleton, the deployment is in error showing the message:

...name=ServiceBean, service=ejb3 is already installed

What can I do to avoid the deployment error?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼睛会笑 2024-12-17 22:51:40

您可以在同一个 bean 中使用 @WebService 和 @Stateless 或 @WebService 和 @Singleton,如果您想将 POJO 公开为 Web 服务和 EJB,那么这是非常有意义的。

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

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

You can use @WebService and @Stateless or @WebService and @Singleton in the same bean which makes perfectly sense if you want to expose a POJO as both a web service and EJB.

Don't see much sense in using @Stateless and @Singleton in the same bean. When you use @Singleton, you are creating an EJB with all the EJB capabilities (transaction management, security, etc) exactly as with @Stateless. The only difference is how the container manages the EJB lifecycle:

  • @Stateless: the EJB instance is created immediately after the first request and when the request ends, the EJB is pooled and ready for reuse if another request comes in. However, if all the pooled instances are being used in the moment another request comes in for the same bean, the container creates a new instance of the same to serve that new request.
  • @Singleton: the EJB instance is created after the first request (by default - see @Startup to override this behavior) comes in and that will be the only instance created by the container. If another request wants to use the same EJB, the container will never create a new instance of it - the instance previously created will be used. It is like a @Stateless EJB with a pool size of 1 :) Aspects like concurrency are important when using these, but this is probably out of the scope of this post.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文