我在下面有事件流代码块:
@RequestMapping(value = "/stream/{columnId}/data", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
@ResponseBody
public Flux<Activity> streamingData(@PathVariable String columnId, HttpSession httpSession) {
try {
ColumnObject columnObject = streamHelper.findColumnObjectInListById(columnId);
return streamHelper.getStreamData(httpSession.getId(), columnObject);
} catch (Exception e) {
...
}
}
在通过端点创建6列之后,spring服务器会将所有后续请求置于未决状态。
(例如,获取,发布方法)
@RequestMapping(value = "/session/metrics", method = RequestMethod.GET)
public ResponseEntity<?> keepSessionAliveMetrics(HttpSession httpSession) {
return new ResponseEntity<Void>(HttpStatus.OK); // STATE ONLY PENDING
}
答案 0 :(得分:0)
如Marten Deinum所指出的那样,这是一个典型的硬限制:浏览器倾向于限制到给定域的并发连接数。
如果您的应用程序需要大量的多路复用,也许使用WebSockets是更好的选择,因为在单个TCP连接上建立了许多消息通道。
答案 1 :(得分:0)
要绕过浏览器的这种限制,您可以通过HTTP / 2使用服务器发送的事件:HTTP / 2提供了一种多路复用功能,可以绕开此HTTP / 1问题。 有一篇很棒的文章:method set
SpringBoot支持HTTP / 2,但可能不是Spring WebFlux(至少在撰写本文时,是Netty):https://www.smashingmagazine.com/2018/02/sse-websockets-data-flow-http2/
答案 2 :(得分:0)
通过HTTP / 2使用SSE无疑是克服您遇到的限制的最佳方法。您可以在这里找到更多详细信息:https://www.infoq.com/articles/websocket-and-http2-coexist