通过Webflux发送SSE事件时检测到客户端离线

问题描述 投票:0回答:1

将 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 确认但未通知上游时检测到连接丢失有关,但我不确定如何测试它。

非常感谢任何帮助。

java spring spring-webflux netty server-sent-events
1个回答
0
投票

这个问题你解决了吗?我也有同样的问题。可以分享一下你是如何解决的吗?

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