как ждать завершения асинхронного ejb без блокировки предыдущей Java 8 - PullRequest
0 голосов
/ 07 октября 2018

Мне нужен класс как ejb без сохранения состояния с асинхронным методом, но в основном классе мне нужно вызвать один или несколько раз и затем ожидать его завершения без блокировки.Например, я использую @Asynchronus и возвращаю Future, когда он завершится. Я хочу, чтобы в основном потоке вызовов ожидали завершения, поэтому я должен использовать get () для результата (Future), но я не хочу использовать get () ..Я не хочу использовать решения Java 8, такие как CompletableFuture, поэтому я думаю использовать класс обратного вызова.Может быть, с защелкой CountDown, чтобы подождать всех вызванных «потоков», если мне придется вызывать этот метод дважды или более раз.Знаете ли вы, что мое решение, как указано выше, может быть в порядке с JDK7 и JEE6?

@Singleton
@Startup
public class PreapreTaskRunningAsync {

    @EJB
    MyAsyncEJB myAsyncEJB;

    @Lock(LockType.READ)
    public void startTask(){
        myAsyncEJB.getSomethingAsyc(new CallBackFuture());
    }

    final class CallBackFuture implements CallBack<String>{

        @Override
        public void oncomplete(Throwable t, String result) {
            if ( t != null ) {
                t.printStackTrace();
                System.out.println("Exception! " + result);
            }
            System.out.println(result);
        }



    }

    interface CallBack<T> {
        void oncomplete(Throwable t, T result);
    } 

@Stateless
public class MyAsyncEJB {


    @Asynchronous
    public void getSomethingAsyc(PreapreTaskRunningAsync.CallBackFuture stringCallBackFuture){
        try {
            Thread.sleep(3000);
            stringCallBackFuture.oncomplete(null, "DONE!");
        } catch (InterruptedException e) {
            e.printStackTrace();
            stringCallBackFuture.oncomplete(e, "ERROR!");
        }
    }
}

Спасибо!Roby

...