我认为可以通过从@Timeout注释的方法调用Future.cancel(boolean)来实现超时。需要保留对异步方法返回的Future的引用,Singleton-
ejb可以用于此目的。
@Statelesspublic class AsyncEjb { @Resource private SessionContext sessionContext; @Asynchronous public Future<String> asyncMethod() { ... //Check if canceled by timer if(sessionContext.wasCancelCalled()) { ... } ... }}@Singletonpublic 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池



