【问题标题】:Why use @Asynchronous in EJB when we can use ExecutorService? [duplicate]当我们可以使用 ExecutorService 时,为什么在 EJB 中使用 @Asynchronous? [复制]
【发布时间】:2017-02-04 01:32:24
【问题描述】:
我也是 Java 和 EJB 中的多线程新手。我有一个场景,我必须使用线程同时访问 Web 服务。我有两种方法。
- 将 ExecutorService 与 Callable 一起使用以并发访问服务。
- 使用 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:
- 您需要一个具有 EJB 容器的应用程序服务器,以便它可以运行 EJB(例如:Jboss 或 WebLogic)。
1234563 >
MDB的调用由容器控制,无需编写任何代码。
ExecutorService:
- 它由核心 java 提供,因此您不需要像 JBOSS 或 Weblogic 这样的应用服务器,您可以将其作为独立 Java 代码的一部分运行。
- 您需要编写一些代码,例如何时启动线程以及何时结束等,这是您使用 ExecutorService 实现的目标。
注意:根据您的要求,您的选项 1 对我来说似乎是正确的。 “使用带有 Callable 的 ExecutorService 来同时命中服务。”