Spring webflux 客户关闭后未取消或处理流量

Spring 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

当访问通过Chrome或JS
EventSource
返回无限结果的
Flux
时,Chrome上的“X”或运行Javascript
EventSource.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())实现了这一点
,如果您有最后一个对象,这很好。否则您将需要发送假消息,这将使客户端不得不处理/忽略它们。(不理想)