我需要异步地从数据库中获取一些数据,然后与获取的数据同步更新当前缓存的数据。
此刻我的代码如下:
@Asynchronous
public void fetchData() {
CompletableFuture.supplyAsync(() -> {
//Do some logic to fetch data
return fetchedData;
}).thenAccept(fetchedData -> updateCache(fetchedData));
}
我的问题是,当我在测试中调用此方法时,它立即转到thenAccept
,但fetchedData
为空。我尝试更改方法,返回CompletableFuture<List<Data>>
,并在测试中调用fetchData().join()
。它工作正常,但是首先-我的应用无法构建,因为@Asynchronous
需要返回Future
或void
,而且我不认为更改方法来测试它是一个好方法理念。
我听说过Await库,但是不能在当前项目中使用它。
我也不确定,是否需要@Asynchronous
?如果我没记错的话,CompletableFuture
应该默认在自己的线程中运行?
答案 0 :(得分:3)
Jacek,我认为@Asynchronous注释不是必需的。您可以使用可完成未来的纯粹形式。我在下面根据您提供的代码提供了示例代码。
public String getInfoFromDB() {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Data from DB";
}
public void updateCache(String dataFromDB) {
System.out.println("Data from D : " + dataFromDB);
System.out.println("Doing some operations with data from DB");
}
public void fetchData() {
CompletableFuture cf =
CompletableFuture.supplyAsync(() -> getInfoFromDB())
.thenAccept(dataFromDB -> updateCache(dataFromDB));
cf.join();
}