11

私は最近、アノテーションを追加するだけで、セッション Bean メソッドを簡単に非同期にできることを知りました。@Asynchronous

例えば

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

Java EE 7 でConcurrency Utilitiesが追加されたことは知っていますが、Java EE 6 では@Asyncronousメソッドのスレッド プール構成はどこにあるのでしょうか。タイムアウトを設定する方法はありますか? それは固定スレッドプールですか?キャッシュされたもの?それの優先順位は何ですか?コンテナーのどこかで構成可能ですか?

4

2 に答える 2

3

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

于 2013-06-19T09:41:52.023 に答える