Как описано в JavaDoc, Flux#startWith
будет предшествовать данной последовательности.
Поскольку вы передаете Flux.interval(Duration.ofSeconds(1))
в качестве аргумента, он будет бесконечно испускать long каждую секунду, и ваш основанный на Flux.create
издатель никогда не будет подписан.
Однако, это работает, если вы измените его на:
.startWith(Mono.delay(Duration.ofSeconds(1)))
Вы также можете изменить код на:
Flux.<Integer> create(e -> {
log.info("create");
e.next(2);
})
.startWith(1)
.switchMap(v -> Flux.interval(Duration.ofSeconds(v)))
.subscribe(e -> log.info("subscribe: {}", e));
Здесь мы используем startWith
сразу после блока Flux.create
и позволяем switchMap
обрабатывать его как любой другой сигнал.
Также помните, что switchMap(v -> Flux.interval(Duration.ofSeconds(v)))
читается как:
«Начать излучать каждые N секунд, где N - самое последнее излучаемое значение»
Если вам нужно «отложить» это только один раз, рассмотрите возможность использования Mono.delay
и здесь.