I think timeout could be achieved by invoking Future.cancel(boolean) from a method annotated @Timeout. Requires keeping a reference to the Future returned by the async method, Singleton-ejb can be used for this.
@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);
}
}
Edit (new below):
In glassfish you may configure the ejb-pool by seting below attributes in the admin console
- Initial and Minimum Pool Size
- Maximum Pool Size
- Pool Resize Quantity
- Pool Idle Timeout
see Tuning the EJB Pool