我在哪里可以在Java EE 6中配置@Asynchronous调用后面的线程池?

我最近了解到,通过简单地添加@Asynchronous注释,我可以轻松地使任何会话bean方法异步 。

例如

 @Asynchronous public Future processPayment(Order order) throws PaymentException { ... } 

我知道Java EE 7添加了Concurrency Utilities ,但在Java EE 6中, @Asyncronous方法的线程池配置在@Asyncronous ? 有没有办法设置超时? 它是一个固定的线程池吗? 一个缓存的? 什么是优先事项? 它可以在容器中的某个位置配置吗?

我认为可以通过从注释@Timeout的方法调用Future.cancel(boolean)来实现超时。 需要保持对async方法返回的Future的引用,可以使用Singleton-ejb。

 @Stateless public class AsyncEjb { @Resource private SessionContext sessionContext; @Asynchronous public Future asyncMethod() { ... //Check if canceled by timer if(sessionContext.wasCancelCalled()) { ... } ... } } @Singleton public class SingletonEjb { @EJB AsyncEjb asyncEjb; Future theFuture; public void asyncMethod() { theFuture = asyncEjb.asyncMethod(); //Create programatic timer long duration = 6000; Timer timer = timerService.createSingleActionTimer(duration, new TimerConfig()); } //Method invoked when timer runs out @Timeout public void timeout(Timer timer) { theFuture.cancel(true); } } 

编辑(下面的新内容):

在glassfish中,您可以通过在管理控制台中设置以下属性来配置ejb-pool

  • 初始和最小池大小
  • 最大泳池大小
  • 池调整数量
  • 池空闲超时

请参阅调整EJB池

尽管我发现的解决方案仅在Java EE 7 / GlassFish 4.1上进行了测试,但我认为它也适用于GlassFish 3.x.

在java.net上有一个JIRA 条目 ,其中列出了不同的设置。 由于Oracle将在该网站上拔掉插件,我将引用此处的相关post(添加格式):

例如,配置位于domain.xml中

         

所有上述属性都是可选的。 他们的默认值:

 thread-core-pool-size: 16 thread-max-pool-size: 32 thread-queue-capacity: Integer.MAX_VALUE thread-keep-alive-seconds: 60 allow-core-thread-timeout: false prestart-all-core-threads: false 

通过该主题,我还发现了一篇博客文章 ,解释了核心和最大池大小的工作原理。 引用重点:

在过去,SUN正确地宣称:“这正是它应该如何表现。首先线程增长到coreSize,然后使用队列,然后如果队列填满,那么线程数量从coreSize扩展到maxSize。因此,如果你使用一个无界的队列,最后一部分永远不会发生。这在文档中有所描述。如果你想要一个无界的队列但是更多的线程然后增加核心大小。否则考虑一个有界队列是否更适合你的需要。“