Java ListenableFuture链能否处理内部ExecutionException?
我得到了一个api(fnGrpc),它执行gRPC调用并返回一个Java ListenableFuture链能否处理内部ExecutionException?,java,asynchronous,java-8,guava,future,Java,Asynchronous,Java 8,Guava,Future,我得到了一个api(fnGrpc),它执行gRPC调用并返回一个ListenableFuture,该值解析为某个值v(其实现是固定的,不可修改的) 我想提供一个助手函数(fnheloper),它可以: 对gRPC结果进行一些转换处理,其本身返回一个解析为转换值的ListenableFuture 处理gRPC调用失败,并返回一些其他值t2,而不是让fnheloper的调用者看到执行异常 我可以使用Futures.transform()来解决(1): 我如何在FNHeloper返回一个Listena
ListenableFuture
,该值解析为某个值v(其实现是固定的,不可修改的)
我想提供一个助手函数(fnheloper),它可以:
ListenableFuture
执行异常
Futures.transform()
来解决(1):
我如何在FNHeloper返回一个ListenableFuture
并保持非阻塞的情况下实现(2)?
我可以让fnheloper自己创建一个额外的线程,在这个线程中我可以调用
.get()
,在fnGrpc上,但是有没有其他方法可以避免这个额外的线程呢?我不是番石榴专家,但似乎你可以使用相同的实用程序类,特别是方法,其中可以传递一个函数,该函数返回具有回退值(t2
)的ListenableFuture
:
注意:在上一段代码中,我使用了catching
而不是catchingAsync
来与您问题中的代码保持一致,并且我没有指定执行者。您可能需要使用带有Async
后缀的方法进行非阻塞处理
package myHelper;
ListenableFuture<T> fnHelper() {
return Futures.transform(fnGrpc(), new Function<V, T>() {
@Override
public T apply(V v) {
T t1 = f(v);
return t1;
}
});
}
package myApp;
// ...
try {
T t = fnHelper().get();
} catch (ExecutionException | InterruptedException ex) {
// ...
}
ListenableFuture<Integer> faultTolerantFuture = Futures.catchingAsync(originalFuture,
Exception.class, x -> immediateFuture(t2), executor);
ListenableFuture<T> fnHelper() {
return Futures.catching(Futures.transform(fnGrpc(), new Function<V, T>() {
@Override
public T apply(V v) {
T t1 = f(v);
return t1;
}
}),
Exception.class, x -> immediateFuture(t2));
}