Java Spark:使用 CompletableFutures 的非阻塞路由/回调
Java Spark: Non-blocking routes / callbacks with CompletableFutures
我必须在 Spark API 实现中调用长 运行 方法。这些方法 return CompletableFutures,所以我想通过触发 Spark 在回调中响应客户端请求来释放当前线程。
据我所知,这对于 Spark 是不可能的,但我想确保我没有忽略任何东西。
为了说明这个问题,请参见下面的小代码示例。
import spark.Spark;
import java.util.concurrent.CompletableFuture;
public class HelloSpark {
public static void main(String[] args) {
Spark.get("/what_i_have_to_do", (req, res) -> {
CompletableFuture<String> f = callToSlowWorker();
return f.get();
});
Spark.get("/what_i_would_like_to_do", (req, res) -> {
CompletableFuture<String> f = callToSlowWorker();
f.whenComplete((answer, throwable) -> {
if(throwable != null){
// send error to requesting client
res.status(500);
res.body(throwable.getMessage());
} else {
// send answer to requesting client
res.body(answer);
}
// trigger spark to return the response to the client
// ...?!?
});
return null; // obviously not what I want, just to make this sample code compile
});
}
static CompletableFuture<String> callToSlowWorker(){
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
return "Hello World";
});
}
}
SparkJava 目前仅支持阻塞,因此您所描述的是不可能的。有一个开放的 enhancement request 添加对非阻塞 API 的支持。
我必须在 Spark API 实现中调用长 运行 方法。这些方法 return CompletableFutures,所以我想通过触发 Spark 在回调中响应客户端请求来释放当前线程。 据我所知,这对于 Spark 是不可能的,但我想确保我没有忽略任何东西。 为了说明这个问题,请参见下面的小代码示例。
import spark.Spark;
import java.util.concurrent.CompletableFuture;
public class HelloSpark {
public static void main(String[] args) {
Spark.get("/what_i_have_to_do", (req, res) -> {
CompletableFuture<String> f = callToSlowWorker();
return f.get();
});
Spark.get("/what_i_would_like_to_do", (req, res) -> {
CompletableFuture<String> f = callToSlowWorker();
f.whenComplete((answer, throwable) -> {
if(throwable != null){
// send error to requesting client
res.status(500);
res.body(throwable.getMessage());
} else {
// send answer to requesting client
res.body(answer);
}
// trigger spark to return the response to the client
// ...?!?
});
return null; // obviously not what I want, just to make this sample code compile
});
}
static CompletableFuture<String> callToSlowWorker(){
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
return "Hello World";
});
}
}
SparkJava 目前仅支持阻塞,因此您所描述的是不可能的。有一个开放的 enhancement request 添加对非阻塞 API 的支持。