Search code examples
javajakarta-eeglassfish-3java-ee-6

Where can I configure the thread pool behind the @Asynchronous calls in Java EE 6?


I recently learned that I can easily make any session bean method Asynchronous by simply adding the @Asynchronous annotation.

E.g.

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

I know that Java EE 7 added Concurrency Utilities, but in Java EE 6, where is the thread pool configuration of the @Asyncronous methods? is there a way to set a timeout? is it a fixed thread pool? a cached one? what is it's priority? Is it configurable somewhere in the container?


Solution

  • 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