【发布时间】:2018-03-13 02:51:31
【问题描述】:
我正在尝试对某些数据库异常执行带有重试策略的数据库查询。重试策略的代码不是很相关,所以我没有包含它。正如您在下面的代码中看到的 - 我编写了一个 retryCallable,它采用重试策略和 populateData() 中的 Callable。
在getDataFromDB 中,我从数据库中获取数据并将数据放入一个全局哈希映射中,该哈希映射用作应用程序级别的缓存。
此代码按预期工作。我想从另一个类调用populateData。但是,这将是一个阻塞调用。由于这是数据库并且具有重试策略,因此这可能会很慢。我想异步调用populateData。
如何使用 CompletableFuture 或 FutureTask 来实现这一点?
CompletableFuture.runAsync 需要一个可运行的。 CompletableFuture.supplyAsync 需要一个供应商。我以前没有实现过这些东西。因此,任何关于最佳实践的建议都会有所帮助。
Class TestCallableRetry {
public void populateData() {
final Callable<Set<String>> retryCallable = new RetryingCallable<>(retryStrategyToRetryOnDBException(), getDataFromDB());
Set<String> data = new HashSet<>();
data = retryCallable.call();
if (data != null && !data.isEmpty()) {
// store data in a global hash map
}
}
private Callable<Set<Building>> getDataFromDB() {
return new Callable<Set<String>>() {
@Override
public Set<String> call() {
// returns data from database
}
};
}
}
Class InvokeCallableAsynchronously {
public void putDataInGlobalMap {
// call populateData asynchronously
}
}
【问题讨论】:
标签: java runnable callable completable-future