package it.tdlight.reactiveapi; import java.time.Duration; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; import reactor.core.publisher.Sinks.EmitFailureHandler; import reactor.core.publisher.Sinks.Empty; public abstract class SimpleEventProducer implements EventProducer { private final Empty closeRequest = Sinks.empty(); @Override public final Mono sendMessages(Flux eventsFlux) { return handleSendMessages(eventsFlux.takeUntilOther(closeRequest.asMono())); } public abstract Mono handleSendMessages(Flux eventsFlux); @Override public final void close() { closeRequest.emitEmpty(EmitFailureHandler.busyLooping(Duration.ofMillis(100))); } }