将 Spring Webflux 与 Netty 结合使用,下面的代码每 5 秒向连接到该 SSE 端点的任何客户端发送一次心跳。
@RestController
@RequestMapping(value="/")
public class SSE {
@RequestMapping(method=RequestMethod.GET)
public Flux<ServerSentEvent<Object>> streamEvents() {
System.out.println("Someone's connected");
Consumer <SignalType> disconnectionConsumer = new Consumer <SignalType> () {
@Override
public void accept(SignalType t) {
System.out.println("Someone's dis(connected)");
}
};
return Flux
.interval(Duration.ofSeconds(5))
.map(second -> {
System.out.println("Sending heartbeat...");
return ServerSentEvent.<Object> builder()
.event("heartbeat")
.build();
})
.doFinally(disconnectionConsumer)
.subscribeOn(Schedulers.parallel());
}
}
现在,如果客户端有效地结束了 TCP 连接,那么 Flux 将完成,并且 disconnectionConsumer 将按预期被调用。但是,如果客户端失去与服务器的连接(无论是禁用其网络接口还是失去 Wi-Fi/移动信号),那么服务器不会检测到连接已断开并继续发送心跳。
发生这种情况时,如何检测客户端失去连接并完成 Flux?我怀疑这可能与 Netty 在尝试接收 TCP 确认但未通知上游时检测到连接丢失有关,但我不确定如何测试它。
非常感谢任何帮助。
这个问题你解决了吗?我也有同样的问题。可以分享一下你是如何解决的吗?