Spring webflux 客户关闭后未取消或处理流量
当访问通过Chrome或JSSpring webflux 客户关闭后未取消或处理流量,spring-webflux,eventsource,Spring Webflux,Eventsource,当访问通过Chrome或JSEventSource返回无限结果的Flux时,Chrome上的“X”或运行JavascriptEventSource.close()都不会触发FluxEmitter的onCancel()或onDispose()。这些事件似乎只在Spring关机时运行 当客户端停止时,如何使流量关闭 下面是一个流量的示例 public class MyRepository { public Flux<MyObject> getFlux() { retur
EventSource
返回无限结果的Flux
时,Chrome上的“X”或运行JavascriptEventSource.close()
都不会触发FluxEmitter
的onCancel()
或onDispose()
。这些事件似乎只在Spring关机时运行
当客户端停止时,如何使流量
关闭
下面是一个流量的示例
public class MyRepository {
public Flux<MyObject> getFlux() {
return Flux<MyObject>.create(sink -> {
for(...) { // get data we have now in EhCache.
sink.next(myObject);
}
myListener = new MyListener() { // get updates from EhCache events.
public void onEvent(MyEvent e) {
sink.next(e.getNewValue());
}
};
sink.onCancel(() -> {
System.out.println("** CANCELLED **");
sink.complete();
}
sink.onDispose(() -> {
System.out.println("** DISPOSED **");
}
}
);
}
公共类MyRepository{
公共流量getFlux(){
返回通量。创建(接收器->{
对于(…){//获取我们现在在EhCache中的数据。
下一步(myObject);
}
myListener=新建myListener(){//从EhCache事件获取更新。
公共无效OneEvent(MyEvent e){
sink.next(如getNewValue());
}
};
sink.onCancel(()->{
系统输出打印项次(“**取消**”);
sink.complete();
}
sink.onDispose(()->{
System.out.println(“****”);
}
}
);
}
这就是终点
@Autowired MyRepository myRepository;
@GetMapping(value="/myUrl", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<MyObject> getMyObjects() {
myRepository.getFlux();
}
@Autowired-MyRepository-MyRepository;
@GetMapping(value=“/myUrl”,products=MediaType.TEXT\u EVENT\u STREAM\u value)
公共流量getMyObjects(){
myRepository.getFlux();
}
如果没有cancel\close,并且在来自Flux的一系列请求之后,Spring开始消亡,因为资源没有被释放
我使用的是Sping5.1.5、Boot 2.1.3、Reactor 3.2.6和Netty 4.1.33。问题的可能重复之处在于Netty没有从客户端捕获关闭。链接中的解决方案是不断重新发送,让服务器端发现连接已关闭。我使用
merge(Flux.interval(…).map实现了这一点(x->new getLastMyObject())
,如果您有最后一个对象,这很好。否则您将需要发送假消息,这将使客户端不得不处理/忽略它们。(不理想)问题的可能重复之处在于Netty没有从客户端捕获关闭。链接中的解决方案是不断重新发送,并让服务器端发现连接已关闭。我使用merge(Flux.interval(…).map(x->new getLastMyObject())实现了这一点
,如果您有最后一个对象,这很好。否则您将需要发送假消息,这将使客户端不得不处理/忽略它们。(不理想)