一尘不染

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

java

我最近了解到,只需添加批注,就可以轻松地使任何会话bean方法异步@Asynchronous

例如

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

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


阅读 240

收藏
2020-12-03

共1个答案

一尘不染

我认为可以通过从@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池

2020-12-03