Rest API:控制器中返回 CompletableFuture 不会使 API 异步运行

问题描述 投票:0回答:1
/**
 * Async work.
 */
@GetMapping(value = "/async/data/v4")
public void getDataAsyncV4() {
    CompletableFuture.supplyAsync(() -> {
        try {
            Thread.sleep(1000); // Sleep for 1 second (does not block the main thread)
            return Data.builder().data("Some Data").threadId(Thread.currentThread().getId()).requestCameTime(System.currentTimeMillis()).build();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    });
}

/**
 * Async doesn't work if return CompletableFuture.
 */
@GetMapping(value = "/async/data/v5")
public CompletableFuture<Data> getDataAsyncV5() {
    return CompletableFuture.supplyAsync(() -> {
        try {
            Thread.sleep(1000); // block main thread
            return Data.builder().data("Some Data").threadId(Thread.currentThread().getId()).requestCameTime(System.currentTimeMillis()).build();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    });
}

我有两个如上所述的 API,问题是唯一返回 void 的 API 方法 getDataAsyncV4() 是异步运行的,而返回 CompletableFuture 的 API 方法 getDataAsyncV5() 总是阻塞主线程。我尝试了不同的方法,例如使用注释@EnableAsync,添加客户执行器..但它不起作用,我仍然不明白为什么。

java spring-boot rest asynchronous
1个回答
0
投票

要使 API 异步,您需要使用

@SpringBootApplication
注释来注释您的应用程序类(带有
@EnableAsync
的类)。然后用
@Async
注释要异步运行的方法,并将该方法的返回类型更改为
CompletableFuture<YourType>
。 该方法的返回语句将是这样的:

return CompletableFuture.completedFuture(yourType);

这是一个完整的例子:

@Async
public CompletableFuture<User> findUser(String user) throws InterruptedException {
  User results = //...
  return CompletableFuture.completedFuture(results);
}

更多详情请参阅官方文档:https://spring.io/guides/gs/async-method/

© www.soinside.com 2019 - 2024. All rights reserved.