使用void方法在java中进行异步编程

时间:2018-03-29 09:30:04

标签: java asynchronous

我从未真正使用过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中哪种做法最好?

2 个答案:

答案 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;
        });

正如您所看到的,您可以致电thenComposeAsyncthenCompose来构建一系列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);
    }
  };
}