我在玩“ 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

最佳答案

您没有使用可听的期货。您正在执行代码,并将结果放在可听的将来。

为了触发onFailure,您需要在将来运行失败的代码,或者在异常情况下完成将来的代码。

例如

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


通常,可以预期从ListeningExecutorService中检索可听期货。 ListenableFutureCompletableFuture不同,它不能从外部完成。

09-26 18:05