【问题标题】:Java Spark: Non-blocking routes / callbacks with CompletableFuturesJava Spark:具有 CompletableFutures 的非阻塞路由/回调
【发布时间】:2017-02-24 09:12:02
【问题描述】:

我必须在 Spark API 实现中调用长时间运行的方法。这些方法返回 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";
        });
    }
}

【问题讨论】:

    标签: java multithreading callback future spark-java


    【解决方案1】:

    SparkJava 当前仅阻塞,因此您描述的内容是不可能的。有一个开放的enhancement request 添加对非阻塞 API 的支持。

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多