Java Spark:具有CompletableFutures的非阻塞路由/回调
我必须在Spark API实现中调用长时间运行的方法。这些方法返回CompletableFutures,因此我想通过触发Spark在回调中响应客户机请求来释放当前线程。 据我所知,这是不可能的火花,但我想确保我没有忽视任何东西。 要说明这个问题,请参见下面的小代码示例Java Spark:具有CompletableFutures的非阻塞路由/回调,java,multithreading,callback,future,spark-java,Java,Multithreading,Callback,Future,Spark Java,我必须在Spark API实现中调用长时间运行的方法。这些方法返回CompletableFutures,因此我想通过触发Spark在回调中响应客户机请求来释放当前线程。 据我所知,这是不可能的火花,但我想确保我没有忽视任何东西。 要说明这个问题,请参见下面的小代码示例 import spark.Spark; import java.util.concurrent.CompletableFuture; public class HelloSpark { public static vo
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";
});
}
}
导入spark.spark;
导入java.util.concurrent.CompletableFuture;
公共类HelloSpark{
公共静态void main(字符串[]args){
Spark.get(“/what\u i\u have\u to\u do”,(req,res)->{
CompletableFuture f=callToSlowWorker();
返回f.get();
});
Spark.get(“/我想做什么”,(请求,res)->{
CompletableFuture f=callToSlowWorker();
f、 完成时(回答,可丢弃)->{
if(可丢弃!=null){
//向请求客户端发送错误
物质状态(500);
res.body(throwable.getMessage());
}否则{
//向请求客户端发送应答
res.body(答案);
}
//触发spark以将响应返回给客户端
// ...?!?
});
return null;//显然不是我想要的,只是为了编译这个示例代码
});
}
静态CompletableFuture callToSlowWorker(){
返回CompletableFuture.SupplySync(()->{
试一试{
睡眠(1000);
}捕获(InterruptedException被忽略){
}
返回“你好世界”;
});
}
}
SparkJava当前仅阻塞,因此您所描述的是不可能的。对于非阻塞API,有一个开放的添加支持 SparkJava目前只阻塞,因此您所描述的是不可能的。对于非阻塞API,有一个开放的添加支持