EJB和线程

时间:2011-01-03 19:38:51

标签: java java-ee ejb message-driven-bean

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

4 个答案:

答案 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和跨服务器进行扩展。