5.2 HTTP Streaming
DeferredResult
和Callable
只能异步返回单个值;如果我们想有多个异步返回的话,我们可以用HTTP Streaming来实现。
HTTP Streaming是一种推送形式的数据传输技术,它通过无限期开放的HTTP连接让web服务器(tomcat)能持续向客户端(浏览器)传送数据。
在HTTP Streaming下,web服务器会握住客户端的请求并让返回保持开放,这样服务器可以通过返回一直发送数据。这个请求-返回的通道会一直开启,除非我们显示的要求关闭。
5.2.1 ResponseBodyEmitter
我们可以使用ResponseBodyEmitter
作为返回值返回数据对象的流。我们可以用ResponseEntity
来包装ResponseBodyEmitter
,这样我们可以定制返回的状态和头信息。
我们定义本里所需的控制器方法,这个例子和DeferredResult
类似:
@RestController
@RequestMapping("/async")
@Slf4j
public class AsyncController {
private static Map<Long, ResponseBodyEmitter> responseBodyEmitterMap = new HashMap<>();
@GetMapping(value = "/{id}/rbe") //1
public ResponseEntity<ResponseBodyEmitter> responseBodyEmitter