【问题标题】:Why use @Asynchronous in EJB when we can use ExecutorService? [duplicate]当我们可以使用 ExecutorService 时,为什么在 EJB 中使用 @Asynchronous? [复制]
【发布时间】:2017-02-04 01:32:24
【问题描述】:

我也是 Java 和 EJB 中的多线程新手。我有一个场景,我必须使用线程同时访问 Web 服务。我有两种方法。

  1. 将 ExecutorService 与 Callable 一起使用以并发访问服务。
  2. 使用 EJB 的 @Asynchronous 注解。

我读到的是:EJB 建议使用@Asynchronous 来编写我们自己的线程实现。读完这篇文章后,我对 EJB 为什么这么说感到困惑。因为 EJB 在 JVM 下工作,所有线程都将从 JVM 创建。那么为什么 EJB 限制我们使用它是 @Asynchronous 而不是我们的实现。

我在谷歌上搜索,但没有找到任何满意的答案。如果有人知道EJB中线程创建和管理的细节,请解惑。

【问题讨论】:

    标签: java multithreading asynchronous jvm ejb


    【解决方案1】:

    基本上可以在EJB 3.1 specification找到答案:

    企业 bean 不得尝试管理线程。企业 bean 不得尝试启动、停止、暂停或恢复线程,或者更改线程的优先级或名称。企业 bean 不得尝试管理线程组。

    这些功能是为 EJB 容器保留的。允许企业 bean 管理线程会降低容器正确管理运行时环境的能力。

    我想这个解释不言自明。 Java EE 通常在应用服务器上的容器中实现,该规范旨在为容器提供最佳条件以高效完成其工作。

    我能想到的另一个原因,我猜 Java EE 规范存在的原因之一是它允许可重用​​性。可以这么说,没有必要重新发明轮子。

    【讨论】:

      【解决方案2】:

      这里有更多信息

      对于 EJB:

      1. 您需要一个具有 EJB 容器的应用程序服务器,以便它可以运行 EJB(例如:Jboss 或 WebLogic)。
      2. 1234563 >
      3. MDB的调用由容器控制,无需编写任何代码。

      ExecutorService:

      1. 它由核心 java 提供,因此您不需要像 JBOSS 或 Weblogic 这样的应用服务器,您可以将其作为独立 Java 代码的一部分运行。
      2. 您需要编写一些代码,例如何时启动线程以及何时结束等,这是您使用 ExecutorService 实现的目标。

      注意:根据您的要求,您的选项 1 对我来说似乎是正确的。 “使用带有 Callable 的 ExecutorService 来同时命中服务。”

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2017-02-03
        相关资源
        最近更新 更多