Spring WebFlux 检测客户端断开连接

iva*_*kov 7 spring flux server-sent-events spring-webflux

假设如下@RestController

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

还有某处

sink.next(new Object());
Run Code Online (Sandbox Code Playgroud)

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

尝试使用isCanceled,它每次都返回 false。

是否可以检测到FluxSink客户端仍在使用?

JEY*_*JEY 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");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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