Spring MVC JavaSpring:如何处理@Async方法的返回值?

hgqdbh6s  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(284)

说我有办法

@RestController
@RequestMapping(value = "/")
public class AppController {

    @Async
    @PostMapping(value="/")
    public CompletableFuture<> doSomething(@RequestBody ..., HTTPServletResponse response){
         //something; 
     return completableResult;
    }
}

我知道该方法将立即返回并释放容器线程。
但是如何处理返回的值(一段时间后)呢?
有听众吗?
这不会阻塞其中一个容器线程吗?
难道没有像future.get()这样的内部执行的东西吗?

jbose2ul

jbose2ul1#

有一个doSomething.isDone()方法来检查future是否准备好了。你可以实现if语句来检查isDone是否返回true(并调用.get()方法来检索future所拥有的内容)。如果它返回false,则意味着你需要等待future。
编辑:在帖子被编辑后,我的回答不再那么有联系了,但我会以类似的方式来做,因为我描述。

4smxwvx5

4smxwvx52#

我知道我迟到了,但对其他人来说,这可能是有帮助的。
首先是:
1.我看到您在同一个函数中同时使用了Async和CompletableFuture。它们用于执行相同的操作,即处理异步请求。
1.他们两个都能独立做同样的事情。
1.我不推荐使用isDone,因为您必须等待一段未知的时间才能返回值。我觉得最好让消费者(前端、浏览器或发出请求的任何人)等待响应。

使用@async

在这里,我们创建了一个CompletableFuture对象,并从async方法返回它。(浏览器或您来自前端的GET请求)将等待此对象完成。在我们完成异步任务(在另一个线程上运行)后,我们使用所需的CompletableFuture值完成cp对象,SpringBoot将你的CompletableFuture对象转换为该值的相关类型。

@Async
public CompletableFuture<String> doSomeThing() throws InterruptedException {
    CompletableFuture<String> cp = new CompletableFuture<String>();
    int i = 5; 
    while(i-- >= 0){
        System.out.println("Doing something ");
        Thread.sleep(2000);
    } 

    if(i < 0){
        cp.complete("Done doing something ");
    }
    return cp;
}

正在使用CompletableFuture

CompletableFuture API具有方法,runAsyncsupplyAsync
1.异步运行:方法接受一个Runnablelambda函数。此方法用于在不同线程上计算异步任务,而不返回任何内容。
1.供应异步:方法接受一个Supplier类型的lambda函数并返回一个CompletableFuture。
我们可以使用supplyAsync方法返回completablefuture,并且在不同的线程中运行任务,而不使用@Async注解。

public CompletableFuture<String> doSomeThing() {
    return CompletableFuture.supplyAsync(()-> {
        int i =3;
        while(i-- >= 0){
            System.out.println("Doing something ");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "Done doing something";
    });
}

希望这能让关于CompletableFuture的事情变得更清楚。😋

相关问题