我最近了解到,只需添加批注,就可以轻松地使任何会话bean方法异步@Asynchronous。
@Asynchronous
例如
@Asynchronous public Future<String> processPayment(Order order) throws PaymentException { ... }
我知道Java EE 7添加了Concurrency Utilities,但是在Java EE 6中,方法的线程池配置在@Asyncronous哪里?有没有办法设置超时时间?是固定线程池吗?一个缓存的?优先级是什么?是否可以在容器中的某个位置进行配置?
@Asyncronous
我认为可以通过从@Timeout注释的方法调用Future.cancel(boolean)来实现超时。需要保留对异步方法返回的Future的引用,Singleton- ejb可以用于此目的。
@Stateless public class AsyncEjb { @Resource private SessionContext sessionContext; @Asynchronous public Future<String> asyncMethod() { ... //Check if canceled by timer if(sessionContext.wasCancelCalled()) { ... } ... } } @Singleton public class SingletonEjb { @EJB AsyncEjb asyncEjb; Future<String> 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池