我在玩“ 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
中检索可听期货。 ListenableFuture
与CompletableFuture
不同,它不能从外部完成。