EJB和线程

据我所知,从EJB中生成线程是非法的,因为它可能会干扰EJB的生命周期。 但是,使用JDK中的预定义Java类是非法的,它在内部生成并处理EJB中的Executor等线程,特别是MDB?

线程和EJB的最大问题是线程是容器大量使用的有限资源,并且线程错误导致线程池泄漏,可以有效地杀死整个JVM实例。

执行者应该表现得更好,但它仍然会在一段时间内耗尽一个线程; 如果有人调整容器以耗尽可用线程,它也可能会立即失败。

总结一下,你将走钢丝。

你“不能”(不应该)使用线程,线程池,执行器…以上所有。 使用应用服务器的目的只是编写业务逻辑,让应用服务器完成繁重的任务。 如果你真的需要自己做线程,请使用EJB 3.1“单例”服务来管理线程。 但是,正如其他人所提到的,最好将其留给应用服务器。 在app服务器中进行并行处理的一种方法是使用MDB(听起来你已经在使用它),虽然根据并行处理的类型,这些可能过于重量级。

这就是EJB 3.1 @Asynchronous的用途,绝对应该使用而不是Executor。 与容器的线程池竞争通常非常危险。 这样做是杀死​​性能的好方法。

Asynchronous支持将使用容器的线程池,并且更安全。 有关Asynchronous如何工作的详细信息,请参阅此答案 。

要添加到@Charlie Martin的答案,无论Executor需要做什么,您都可以设计另一个EJB来执行相同的操作而不使用Executor。 这允许新EJB在容器处理的单独线程中运行。 缺点是您可能不得不“重新实现轮子”,因为您仍然不想使用JVM中的线程/执行器。 它还增加了让一个EJB定位/请求/连接/调用另一个EJB的开销。

底线是EJB本身应该是工作线程。 复制代码而不是使用Executor似乎有点过分,而且这一点很重要。 最大的区别是规模之一。 执行程序将仅限于单个JVM,而EJB可以跨JVM和跨服务器进行扩展。