为什么制作异步REST服务很有用?

时间:2016-10-04 10:51:43

标签: spring multithreading

Spring允许使用@RequestMapping注释的方法返回各种对象,包括CompletableFutureFuture。这允许我产生一个异步方法,让spring在它准备好时返回值。我不确定我理解的是,这是否有任何好处。例如:

@RestController
public class MyController {
    @RequestMapping("/user/{userId}")
    public CompletableFuture<User> getUser(@PathVariable("userId") String userId) {
        return CompletableFuture.supplyAsync(
              () -> this.dataAccess.getUser(userId));
}

在这种情况下,即使实际计算发生在后台,连接仍然不会关闭,请求线程仍然处于活动状态,直到完成为止。怎么比说:

更好
@RequestMapping("/user/{userId}")
public User getUser(@PathVariableS("userId") String userId) {
    return this.dataAccess.getUser(userId);
}

从第一眼开始,这似乎是一种更好的方法,因为没有额外的线程和观察者寻找完成的开销。

1 个答案:

答案 0 :(得分:1)

这利用了使用request.startAsync()方法的Servlet 3异步请求处理。阅读herehere

  

为实现此目的,Servlet 3 Web应用程序可以调用request.startAsync()并使用返回的AsyncContext继续写入来自其他单独线程的响应。同时,从客户端的角度来看,请求仍然看起来像任何其他HTTP请求 - 响应交互。它只需要更长的时间才能完成。以下是事件序列: