我假设您正在使用Spring
4(AsyncRestTemplate)。在这种情况下,您获得的ListenableFuture实际上不是Guava的ListenableFuture,而是在Spring中的克隆。无论如何,您应该像处理标准Future中的异常一样处理异常。
// does this have to be final? private final AsyncRestTemplaterestTemplate = new AsyncRestTemplate();
它不是(在这种情况下),但这是一个好习惯,因为通常它使对象变得不那么易变,从而简化了有关其行为的推理。
catch (CancellationException e) { // what to do here?}
如果任务被取消(通过Future#cancel或ExecutorService#shutdownNow),则将引发CancellationException。在您的情况下,它不会发生,因为只有您引用了执行查询所使用的Future和(隐式地通过私有AsyncRestTemplate)ExecutorService。所以
throw new AssertionError("executeAsync task couldn't be cancelled", e);
CancellationException和TimeoutException之间有什么区别吗?
在Future#get呼叫中,您已指定超时。如果在keys.getTimeout()毫秒后仍然无法获得结果,则将抛出TimeoutException。
catch (InterruptedException e) { // is this right way to deal with InterruptedException? throw new RuntimeException("Interrupted", e);}
在这种情况下,没有。当 客户端
线程中断时,将引发InterruptedException。您不拥有该线程,因此应该传播InterruptedException(即,声明
executeSync(DataKeykeys) throwsInterruptedException)。如果由于某种原因您不能更改方法的签名,则至少
Thread.currentThread().interrupt()在引发RuntimeException之前还原中断的标志()。
catch (ExecutionException e) { // what do you mean by ExecutionException? And how should we dealwith this?
DataLogging.logErrors(e.getCause(), DataErrorEnum.ERROR_CLIENT,
keys);
response = new DataResponse(null, DataErrorEnum.ERROR_CLIENT,
DataStatusEnum.ERROR);
}
ExecutionException表示在执行过程中以Callable /
Runnable形式提交给ExecutorService的代码引发了异常。在您的情况下,永远不会引发ExecutionException,因为您返回的settableFuture在onSuccess和onFailure回调中均设置了值,因此可以在catch块中引发AssertionError。没有响应ExecutionException的通用策略。
我的DataKey是否必须在界面中是最终的?
它必须在executeAsync实现中是最终的,因为您是从匿名类(onFailure回调)中引用它的;
这是在我的executeAsync方法中使用ListenableFutureCallback的正确方法吗?还是有更好的方法来使用它?
没有发现任何问题。
一些建议:- 考虑使异步客户端的线程池可配置。
默认情况下,AsyncRestTemplate使用SimpleAsyncTaskExecutor,它为每个请求创建新线程。这可能并不适合所有客户。请注意,如果您遵循此建议,对CancellationException的响应必须有所不同,因为客户端现在可以引用ExecutorService:抛出RuntimeException应该很好。
描述默认使用的(java)doc线程池!
我会拆分同步和异步版本。
我认为使用同步RestTemplate并通过同步版本实现异步版本将简化实现。
考虑返回更灵活的ListenableFuture而不是简单的Future(使用SettableListenableFuture而不是SettableFuture)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)