2017-10-05 90 views
2

我有一台服务器,其中有48个CPU托管TomEE + 7.0.2上的Java EE 7 REST API。TomEE中的托管执行程序服务

某些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,到目前为止我没有触及任何配置。

非常感谢您的帮助!

丹尼尔

回答

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更好的选择,在我看来

0

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

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

  1. 它在容器中配置 - 不需要定制应用程序配置,但它仍然可以调整,无需重新编译/更改应用程序
  2. 它不受像@Asynchronous的限制,因为它没有定义任何特定池,因此可移植性不是很高EAS这些托管池是相当均匀
  3. 这些池是“企业”友好的,因为你的听众添加安全和审计
  4. 这些池传播某些方面(安全和JNDI /典型的类加载器)

在tomee我们ali