据我所知,从EJB中生成线程是非法的,因为它可能会干扰EJB的生命周期。但是,使用JDK中的预定义Java类是非法的,它在内部生成并处理EJB中的Executor等线程,特别是MDB?
答案 0 :(得分:9)
你“不能”(不应该)使用线程,线程池,执行器...以上所有。使用应用服务器的目的只是编写业务逻辑,让应用服务器完成繁重的任务。如果你真的需要自己做线程,请使用EJB 3.1“单例”服务来管理线程。但是,正如其他人所提到的,最好将其留给应用服务器。在app服务器中进行并行处理的一种方法是使用MDB(听起来你已经在使用它),虽然根据并行处理的类型,这些可能过于重量级。
答案 1 :(得分:9)
这是EJB 3.1 @Asynchronous
的用途,绝对应该使用而不是Executor。与容器的线程池竞争通常非常危险。这样做是杀死性能的好方法。
Asynchronous
支持将使用容器的线程池,并且更安全。有关Asynchronous
如何运作的详细信息,请参阅this answer。
答案 2 :(得分:4)
线程和EJB的最大问题是线程是容器大量使用的有限资源,而线程错误导致线程池泄漏,可以有效地杀死整个JVM实例。
执行者应该表现得更好,但它仍会在一段时间内耗尽一个线程;如果有人调整容器以耗尽可用线程,它也可能会立即失败。
总结是你将要走钢丝。
答案 3 :(得分:1)
要添加@Charlie Martin的答案,无论Executor需要做什么,您都可以设计另一个EJB来执行相同的操作而不使用Executor。这允许新EJB在容器处理的单独线程中运行。缺点是您可能不得不“重新实现轮子”,因为您仍然不想使用JVM中的线程/ Executor。它还增加了让一个EJB定位/请求/连接/调用另一个EJB的开销。
底线是EJB本身应该是工作线程。复制代码而不是使用Executor可能看起来有点过分,而且它达到了一定程度。最大的区别是规模之一。执行程序将限制为单个JVM,而EJB可以跨JVM和跨服务器进行扩展。