При доступе к Flux
, который возвращает бесконечные результаты через Chrome или JS EventSource
, ни "X" в Chrome, ни запущенный Javascript EventSource.close()
не вызывают FluxEmitter
'onCancel()
или onDispose()
,Кажется, что эти события выполняются только при закрытии Spring.
Как заставить Flux
закрыться, когда клиент останавливается?
Вот пример Flux
;
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 **");
}
}
);
}
А вот и конечная точка;
@Autowired MyRepository myRepository;
@GetMapping(value="/myUrl", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<MyObject> getMyObjects() {
myRepository.getFlux();
}
Без отмены \ закрытия и после нескольких запросов из Flux Spring начинает умирать, поскольку ресурсы не освобождаются.
Я использую Sping 5.1.5, Boot 2.1.3, Reactor 3.2.6 и Netty 4.1.33.