Spring WebFlux 检测客户端断开连接

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

假设以下

@RestController

@GetMapping("listen")
public Flux<Object> listen() {
    return Flux.create(sink -> process(sink));
}

还有某个地方

sink.next(new Object());

此代码没有有关接收器状态或完成的信息

尝试使用

isCanceled
,每次都返回 false。

是否可以检测到

FluxSink
是否仍在被客户端使用?

spring spring-webflux flux server-sent-events
3个回答
6
投票

在 spring-webflux 中,如果客户端关闭连接,订阅将被取消并处置。 如果在 process 方法中添加回调 onCancel 和 onDispose 你会看到这一点。

private <T> void process(final FluxSink<T> sink) {
    sink.onCancel(new Disposable() {
        @Override
        public void dispose() {
            System.out.println("Flux Canceled");
        }
    });

    sink.onDispose(new Disposable() {

        @Override
        public void dispose() {
            System.out.println("Flux dispose");
        }
    });
}

然后向您的端点发送一个 http 请求,并在 Flux 完成之前取消它。您将看到两个回调都被触发。


0
投票

接受的答案仅与“服务器发送事件”结合使用,服务器定期向客户端发送事件,当客户端断开连接时订阅将被取消。正如文档所述https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-codecs-streaming


0
投票

你可以尝试部署到另一台服务器上测试一下,我在本地部署调试的时候也遇到过这个问题。

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