TomEE中的托管执行程序服务
我有一台服务器,其中有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,到目前为止我没有触及任何配置。
非常感谢您的帮助!
丹尼尔
如果注入@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更好的选择,在我看来
,你可以在这里找到http://tomee.apache.org/admin/configuration/resources.html#_managedexecutorservice
的文档,这些执行者的主要优点是:
- 它在容器中配置 - 不需要定制应用程序配置,但它仍然可以调整,无需重新编译/更改应用程序
- 它不受像@Asynchronous的限制,因为它没有定义任何特定池,因此可移植性不是很高EAS这些托管池是相当均匀
- 这些池是“企业”友好的,因为你的听众添加安全和审计
- 这些池传播某些方面(安全和JNDI /典型的类加载器)
在tomee我们ali