3

我有一台具有 48 个 CPU 的服务器,在 TomEE+ 7.0.2 上托管 Java EE 7 REST API。

一些 API 在运行并行算法时需要使用尽可能多的 CPU。并行部分不需要任何数据库或其他资源,只需在共享的 double[][] 矩阵中进行一些繁重的工作。

我通常在 EJB 上下文中工作,但对于这个特定的实例,它不是必需的(也最好不要)。

到目前为止,我正在使用

ExecutorService pool = Executors.newFixedThreadPool(maxThreads); 

为了实例化一个执行程序,但是因为这似乎在操作系统级别产生了实际线程,所以我不是它的忠实粉丝——在一些 JMeter 负载测试之后,它甚至导致了一个点,整个 bash 被阻塞了,我可以在硬重启之前,甚至不再对服务器进行 SSH 连接。

我偶然发现了“托管执行器服务”的概念,但我在网上找不到有关如何使用它(以及配置它)的教程/示例。

有人可以分享以下想法吗?

a) 如何在 TomEE 中配置线程池(例如通过 server.xml、context.xml 或 tomee.xml),代码示例将不胜感激?

b)有没有办法只使用一些默认线程池(并且足够聪明以至于不需要调整,如果没有,我可以从哪里开始调整)?

c) 我如何在 Java 中查找线程池 - 首选通过 JDNI 查找?

d) 如果我曾经决定将该资源作为 EJB 的一部分,那么注入的代码会是什么样子?

我的应用程序上下文在 server.xml 中指定为“myContext”,因此如果您提供示例,您能否准确地指出查找字符串的外观?

除了我有一个非常简单的 TomEE+ 7.0.2 安装之外,到目前为止我没有触及任何配置。

非常感谢你的帮助!

丹尼尔

4

2 回答 2

1

这是一个很好的入门教程:https ://martinsdeveloperworld.wordpress.com/2014/02/25/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions/

如果你注入@ManagedExecutorService,TomEE 应该给你一个默认的服务和池。如果没有,那可能是一个错误:

@Resource
private ManagedExecutorService mes;

您应该可以像这样在 TomEE.xml 中配置它(我没有测试过):

<Resource id="myManagedExecutorService" type="javax.enterprise.concurrent.ManagedExecutorService">
    Core = 5
    Max = 25
    KeepAlive = 5 s
    Queue = 15
    WaitAtShutdown = 30 seconds
</Resource>

在您的代码中:

@Resource("myManagedExecutorService")
private ManagedExecutorService mes;

我通过查看 service-jar.xml 发现了这一点。在我看来,您可能还想要 JMS 和 @Asyncronous,它们比 ManagedExecutorService 更好一些

于 2017-11-06T18:04:26.227 回答
0

你可以在这里找到文档http://tomee.apache.org/admin/configuration/resources.html#_managedexecutorservice

这些执行器的主要优点是:

  1. 它在容器中配置 - 不需要自定义应用程序配置,但它仍然可以在不重新编译/更改应用程序的情况下进行调整
  2. 它不受 @Asynchronous 的限制,它没有定义任何特定的池,因此可移植性不是很高,而这些托管池非常统一
  3. 这些池是“企业”友好的,因为您有侦听器来添加安全性和审计
  4. 这些池传播一些上下文(通常是安全和 jndi/类加载器)

在 tomee 我们阿里

于 2017-11-08T20:21:43.057 回答