Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:通过RESTAPI立即返回响应,并让服务层处理请求_Java_Spring Boot_Concurrency_Java.util.concurrent - Fatal编程技术网

Java Spring:通过RESTAPI立即返回响应,并让服务层处理请求

Java Spring:通过RESTAPI立即返回响应,并让服务层处理请求,java,spring-boot,concurrency,java.util.concurrent,Java,Spring Boot,Concurrency,Java.util.concurrent,在我的应用程序中,我有以下场景:当客户机通过RESTfulAPI发送请求时,它被保存到数据库中,并将持久化对象的id返回给客户机。稍后,使用调度程序(即@scheduler),从数据库中检索之前发出的请求并对其进行处理。这样,客户机通过Restful API(更准确地说,是结果的标识符,而不是结果本身)立即获得响应,并且结果本身会在稍后计算,因为这很耗时。我想知道是否有更好的选择 也就是说,我正在考虑编写一个RESTAPI,其中web层将域对象交给服务播放器。服务层将该域对象保存到数据库中,然后

在我的应用程序中,我有以下场景:当客户机通过RESTfulAPI发送请求时,它被保存到数据库中,并将持久化对象的id返回给客户机。稍后,使用调度程序(即
@scheduler
),从数据库中检索之前发出的请求并对其进行处理。这样,客户机通过Restful API(更准确地说,是结果的标识符,而不是结果本身)立即获得响应,并且结果本身会在稍后计算,因为这很耗时。我想知道是否有更好的选择

也就是说,我正在考虑编写一个RESTAPI,其中web层将域对象交给服务播放器。服务层将该域对象保存到数据库中,然后将域对象的id返回给web层,最后执行耗时的任务

在阅读了有关CompletableFuture的内容后,我决定试一试。但是,我的代码仍然等待耗时的任务完成,然后才将id返回给web层。请参见一个(非常简化的)示例:


这段代码不会编译,在另一条语句之前返回一个
。有用的链接:@大牛:你说得对。解决这个问题。这个通用模型在长时间运行的作业中很常见:分配一个ID,客户端可以使用该ID进行检查(或者您可以通过webhook进行回调)。看看索赔检查设计模式。通常在实现中,您将设置生产者-消费者类型的安排,其中其他执行者负责检查队列并进行处理。对于此类操作和不可完成的未来,请使用@Async注释
public int completableFuture(Dto dto) {

       Domain domain = saveToDB(dto);

       CompletableFuture.supplyAsync(this::calculateTimeConsumingTask) // accepts domain object
                .thenAcceptAsync(this::saveResult);
       return domain.getId();
    }