当我们可以使用ExecutorService时,为什么在EJB中使用@Asynchronous?

时间:2016-09-26 15:58:27

标签: java multithreading asynchronous jvm ejb

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

  1. 使用带有Callable的ExecutorService同时命中服务。
  2. 使用EJB的@Asynchronous注释。
  3. 我读过的是:EJB建议使用@Asynchronous来编写我们自己的线程实现。读完这篇文章后,我很困惑为什么EJB这么说。因为EJB下面的JVM工作,所有线程都是从JVM创建的。那么为什么EJB限制我们使用它的@Asynchronous而不是我们的实现。

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

2 个答案:

答案 0 :(得分:1)

基本上,答案可以在EJB 3.1 specification

中找到
  

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

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

我猜这个解释不言而喻。 Java EE通常在应用程序服务器上的容器中实现,规范旨在为容器提供有效工作的最佳条件。

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

答案 1 :(得分:0)

以下是更多信息

对于EJB:

  1. 您需要一个具有EJB容器的应用程序服务器,以便它可以运行EJB(例如:Jboss或WebLogic)。
  2. EJB就像消息驱动Bean(MDB)可以侦听队列(例如:Hornet Queue,RabbitMQ,IBM mq)等,并在队列上删除消息时处理请求。因此它是异步的。

  3. MDB的调用由容器控制,我们不需要编写任何代码额外代码。

  4. 的ExecutorService:

    1. 它由核心java提供,因此您不需要像JBOSS或Weblogic这样的应用程序服务器,您可以将其作为独立Java代码的一部分运行。
    2. 您需要编写一些代码,以便何时启动线程以及何时结束等,这是您使用ExecutorService实现的目标。
    3. 注意:根据您的要求,您的选项1似乎对我而言。 “使用带有Callable的ExecutorService同时命中服务。”