ListenableFutureCallback - onFailure никогда не вызывается - PullRequest
0 голосов
/ 24 мая 2018

Я играю с 'ListenableFutureCallback'.onSuccess () работает нормально, но onFailure никогда не вызывается.Ниже приведен пример кода.

@Service
public class AsyncClass {

    @Async
    public ListenableFuture<String> execute(Callable<String> callable) throws Exception {
        String str = callable.call();
        //To force an exception to occur
        str.toString();
        return new AsyncResult<>(str);
    }    
}

public void futureMethod(String str) throws Exception {

    AsyncClass asyncClass = new AsyncClass();

    ListenableFuture<String> future = asyncClass.execute(() -> {
        return str;
    });

    future.addCallback(new ListenableFutureCallback<Object>() {

        @Override
        public void onFailure(Throwable ex) {
            System.out.println("FAIL");
        }

        @Override
        public void onSuccess(Object result) {
            System.out.println("SUCCESS");
        }
    });
}

onSuccess работает правильно.

futureMethod("test value");
Console: SUCCESS

onFailure, однако, не работает.

futureMethod(null);
Console: java.lang.NullPointerException: null

1 Ответ

0 голосов
/ 24 мая 2018

Вы не используете прослушиваемое будущее.Вы выполняете код и помещаете результат в прослушиваемое будущее.

Для того чтобы onFailure сработал, вам нужно запустить ошибочный код внутри будущего или завершить будущее с исключением.

Дляпример

Futures.immediateFailedFuture(new RuntimeException("woops"));

Ожидается, что прослушиваемое будущее будет получено из ListeningExecutorService с.ListenableFuture, в отличие от CompletableFuture, внешне не может быть завершено.

...