TomEE中的托管执行程序服务

时间:2017-10-05 16:09:52

标签: service parallel-processing tomee executor tomee-7

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

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

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

到目前为止,我正在使用

ExecutorService pool = Executors.newFixedThreadPool(maxThreads); 

为了实例化一个执行器,但由于这似乎在操作系统级别上产生实际线程,我不是它的忠实粉丝 - 经过一些JMeter负载测试后它甚至导致了一个点,整个bash被阻塞了在硬重启之前我甚至无法SSH服务器。

我偶然发现了#34; Managed Executor Service"的概念,但是我无法在线找到如何使用它的教程/示例(并且还配置它)。

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

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

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

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

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

我的应用程序上下文被指定为" myContext"在server.xml中,如果您提供样本,请指出查找字符串的外观如何?

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

非常感谢你的帮助!

丹尼尔

2 个答案:

答案 0 :(得分:0)

这是一个很好的入门教程: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好一些

答案 1 :(得分:0)

您可以在http://tomee.apache.org/admin/configuration/resources.html#_managedexecutorservice

找到相关文档

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

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