ListenableFutureCallback - 永远不会调用onFailure

时间:2018-05-24 16:28:36

标签: java spring concurrency future

我正在玩'ListenableFutureCallback'。 onSuccess()工作正常,但永远不会调用onFailure。下面是一些示例代码。

tradesDF.write.option("parquet.block.size", 256 * 1024 * 1024)

onSuccess工作正常。

@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");
        }
    });
}
然而, onFailure不起作用。

futureMethod("test value");
Console: SUCCESS

1 个答案:

答案 0 :(得分:1)

你没有使用可听的未来。您正在执行代码并将结果置于可听的未来。

为了触发onFailure,您需要在将来运行失败的代码或完成未来,但有例外。

例如

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

通常可以从ListeningExecutorService检索可收听期货。与ListenableFuture不同,CompletableFuture不能在外部完成。