7

据我了解,从 EJB 中生成线程是非法的,因为它可能会干扰 EJB 的生命周期。但是,使用 JDK 中预定义的 Java 类在 EJB(特别是 MDB)中内部产生和处理线程(例如 Executor)是否违法?

4

4 回答 4

11

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

于 2011-01-03T20:59:16.313 回答
11

这就是 EJB 3.1@Asynchronous的用途,并且绝对应该使用它来代替 Executor。与容器的线程池竞争通常是非常危险的。这样做是扼杀性能的好方法。

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

于 2012-02-26T05:14:55.617 回答
6

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

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

总结是你会走钢丝。

于 2011-01-03T19:47:14.510 回答
1

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

底线是 EJB 本身应该是工作线程。复制代码而不是使用 Executor 似乎有些矫枉过正,而且在一定程度上是这样。最大的区别是规模之一。执行器将被限制为单个 JVM,而 EJB 可以跨 JVM 和跨服务器扩展。

于 2011-01-03T20:02:46.907 回答