【问题标题】:Java EE containers don't allow using Java SE conccurency APIJava EE 容器不允许使用 Java SE 并发 API
【发布时间】:2016-04-03 13:20:33
【问题描述】:

在 Arun Gupta 的“Java EE 7 Essentials”一书中,我发现了这一点:

Java EE 容器(例如 EJB 或 Web 容器)不允许使用通用 Java SE并发API,例如java.util.concurrent.ThreadPoolExecutor, java.lang.Thread,或者直接java.util.Timer。

“不允许”是什么意思?我不明白容器如何禁止我创建新线程或使用标准 ExecutorService。我的标准线程会发生什么?谁能解释一下这些?

一些评论。我理解为什么使用ManagedExecutorService 而不是ExecutorService 例如可以更高效,我不明白如果我使用 SE 会出现什么问题

【问题讨论】:

  • 容器正在运行你的代码,所以它当然可以禁止你使用某些类。您会收到错误消息,并且您的软件将无法运行。
  • 我会得到什么类型的错误?我使用了标准的执行器服务,并且在生产中的多个系统上都可以正常工作
  • 取决于容器,除了你不能确定它“工作正常”。
  • 你能举一些例子吗?
  • 如果容器有自己的SecurityManager,它可以控制(和禁止)你的代码做的很多事情。如果您的代码看起来很好,那么就足够公平了,但至少您已经被警告过您不应该这样做。您的“工作正常”代码在哪个容器上运行?

标签: java jakarta-ee wildfly wildfly-8


【解决方案1】:

如果您继续阅读,我认为答案解释得相当清楚。在本段后面:

... 这是因为所有应用程序代码都在由容器管理的线程上运行,并且每个容器通常期望对容器提供的对象的所有访问都发生在同一线程上。这允许容器管理资源并提供集中管理。此外,不鼓励以非托管方式使用资源,因为它可能会破坏平台旨在提供的企业功能,例如可用性、安全性、可靠性和可扩展性。

我明白你为什么提出最初的问题,但最初陈述的措辞有点混乱。

回答您的问题:
Java EE 容器不必显式阻止您以您可能期望的方式调用这些 API(例如,如果您尝试使用它们则抛出异常)。一些 Java EE 容器可能使用 SecurityManager 或其他东西来阻止对某些类的访问,但规范没有要求这样做。

但是,Java EE 容器将无法管理您使用这些“非托管”JavaSE API 执行的任何操作,并且当您有可用的托管等效项(例如 ManagedExecutorService 与 @ 987654322@)

为了说明,以下代码在 Servlet 中工作得很好:

Runnable printSomething = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
};

new java.lang.Thread(printSomething, "JavaSE-Thread").start();

(使用 WebSphere Liberty 测试)

但是,这样做被认为是不好的做法,因为:

不鼓励以非托管方式使用资源,因为它可能会破坏平台旨在提供的企业功能,例如可用性、安全性、可靠性和可扩展性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多