我也是Java和EJB中多线程的新手。我有一个场景,我必须使用线程同时访问Web服务。我有两种方法。
我读过的是:EJB建议使用@Asynchronous来编写我们自己的线程实现。读完这篇文章后,我很困惑为什么EJB这么说。因为EJB下面的JVM工作,所有线程都是从JVM创建的。那么为什么EJB限制我们使用它的@Asynchronous而不是我们的实现。
我在谷歌搜索但没有找到任何满意的答案。如果有人知道EJB中的线程创建和管理的细节,请清除我的怀疑。答案 0 :(得分:1)
基本上,答案可以在EJB 3.1 specification:
中找到企业bean不得尝试管理线程。企业bean不得尝试启动,停止,暂停或恢复线程,或更改线程的优先级或名称。企业bean不得尝试管理线程组。
这些函数是为EJB容器保留的。允许企业bean管理线程会降低容器正确管理运行时环境的能力。
我猜这个解释不言而喻。 Java EE通常在应用程序服务器上的容器中实现,规范旨在为容器提供有效工作的最佳条件。
我能想到的另一个原因,我认为Java EE规范存在的原因之一是它允许可重用性。可以这么说,没有必要重新发明轮子。
答案 1 :(得分:0)
以下是更多信息
EJB就像消息驱动Bean(MDB)可以侦听队列(例如:Hornet Queue,RabbitMQ,IBM mq)等,并在队列上删除消息时处理请求。因此它是异步的。
MDB的调用由容器控制,我们不需要编写任何代码额外代码。
注意:根据您的要求,您的选项1似乎对我而言。 “使用带有Callable的ExecutorService同时命中服务。”