Java EJB';螺纹和螺纹

Java EJB';螺纹和螺纹,java,jakarta-ee,ejb,message-driven-bean,Java,Jakarta Ee,Ejb,Message Driven Bean,据我所知,从EJB中生成线程是非法的,因为它可能会干扰EJB的生命周期。但是,使用来自JDK的预定义Java类在内部生成和处理诸如EJB(特别是MDB)中的Executor之类的线程是非法的吗?线程和EJB的最大问题是线程是容器大量使用的有限资源,线程错误会导致线程池泄漏,从而有效地杀死整个JVM实例 执行器应该表现得更好,但它仍将在一段时间内耗尽一个线程;如果有人对容器进行了调优,以用完可用的线程,那么它也可能会立即失败 总之,您将走钢丝。要补充@Charlie Martin的答案,无论您需要

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

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

执行器应该表现得更好,但它仍将在一段时间内耗尽一个线程;如果有人对容器进行了调优,以用完可用的线程,那么它也可能会立即失败


总之,您将走钢丝。

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


底线是EJB本身应该是工作线程。复制代码而不是使用执行器似乎有点过分,这在一定程度上是可以做到的。最大的区别在于规模。执行器将限于单个JVM,而EJB可以跨JVM和服务器进行扩展

您“不能”(不应该)使用线程、线程池、执行器。。。所有这些。使用应用程序服务器的目的是只编写业务逻辑,让应用程序服务器来完成繁重的工作。如果您真的需要自己执行线程,请使用EJB3.1“singleton”服务来管理线程。然而,正如其他人所提到的,最好将此留给应用服务器。在应用程序服务器中执行并行处理的一种方法是使用MDB(听起来您已经在使用MDB),尽管根据并行处理的类型,这些MDB可能太重了。

这就是EJB3.1
@Asynchronous
的用途,并且肯定应该使用MDB而不是执行器。与容器的线程池竞争通常是非常危险的。这样做是扼杀性能的好方法


异步支持将使用容器的线程池,并且更加安全。有关
异步
工作原理的详细信息,请参阅。

我同意charlie的观点,我只是想插嘴说MDB几乎肯定会是更好的解决方案。这是否意味着我可以在MDB中使用Executor而无任何风险?