我从未真正使用过Java中的异步编程,并且在实践中非常困惑是最好的。
我有这个方法
public static CompletableFuture<Boolean> restoreDatabase(){
DBRestorerWorker dbWork = new DBRestorerWorker();
dbWork.run();
return "someresult" ;
}
然后这个调用第一个
@POST
@Path("{backupFile}")
@Consumes("application/json")
public void createOyster(@PathParam("backupFile") String backupFile) {
RestUtil.restoreDatabase("utv_johan", backupFile);
//.then somemethod()
//.then next method()
}
我想要做的是首先调用restoreDatabase()方法,该方法调用dbWork.run()(这是一个void方法),当该方法完成时,我希望createOyster执行下一个,依此类推,直到我有完成了所需的所有步骤。有人得到一个指导方针是从这开始。在今天的Java中哪种做法最好?
答案 0 :(得分:1)
正如您已经使用CompletableFuture
,您可以构建异步执行管道,如。
CompletableFuture.supplyAsync(new Supplier<String>() {
@Override
public String get() {
DBRestorerWorker dbWork = new DBRestorerWorker();
dbWork.run();
return "someresult";
};
}).thenComposeAsync((Function<String, CompletionStage<Void>>) s -> {
CompletableFuture<String> future = new CompletableFuture<>();
try{
//createOyster
future.complete("oyster created");
}catch (Exception ex) {
future.completeExceptionally(ex);
}
return null;
});
正如您所看到的,您可以致电thenComposeAsync
或thenCompose
来构建一系列CompletionStage
s并使用上一步的结果执行任务,或者如果您没有&#39则生成Void有任何回报。
这是一个非常好的guide
答案 1 :(得分:1)
您可以使用AsyncResponse:
import javax.ws.rs.container.AsyncResponse;
public static CompletableFuture<String> restoreDatabase(){
DBRestorerWorker dbWork = new DBRestorerWorker();
dbWork.run();
return CompletableFuture.completedFuture("someresult");
}
和这个
@POST
@Path("{backupFile}")
@Consumes("application/json")
public void createOyster(@PathParam("backupFile") String backupFile,
@Suspended AsyncResponse ar) {
RestUtil.restoreDatabase("utv_johan", backupFile)
.thenCompose(result -> doSomeAsyncCall())
.thenApply(result -> doSomeSyncCall())
.whenComplete(onFinish(ar))
//.then next method()
}
发送回复的效用函数
static <R> BiConsumer<R, Throwable> onFinish(AsyncResponse ar) {
return (R ok, Throwable ex) -> {
if (ex != null) {
// do something with exception
ar.resume(ex);
}
else {
ar.resume(ok);
}
};
}