Spring WebFlux 检测客户端断开连接
Spring WebFlux detect client disconnect
假设如下 @RestController
:
@GetMapping("listen")
public Flux<Object> listen() {
return Flux.create(sink -> process(sink));
}
还有某处
sink.next(new Object());
此代码没有关于接收器状态或完成的信息
尝试使用 isCanceled
,但每次都 returns 错误。
是否可以检测到 FluxSink
是否仍在被客户端使用?
在spring-webflux中,如果客户端关闭连接,订阅将被取消和处理。
如果在处理方法中添加回调 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 请求,并在您的流量完成之前取消它。你会看到两个回调都被触发了。
假设如下 @RestController
:
@GetMapping("listen")
public Flux<Object> listen() {
return Flux.create(sink -> process(sink));
}
还有某处
sink.next(new Object());
此代码没有关于接收器状态或完成的信息
尝试使用 isCanceled
,但每次都 returns 错误。
是否可以检测到 FluxSink
是否仍在被客户端使用?
在spring-webflux中,如果客户端关闭连接,订阅将被取消和处理。 如果在处理方法中添加回调 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 请求,并在您的流量完成之前取消它。你会看到两个回调都被触发了。