Java 通过Flux.create/Flux.switchMap的可变间隔

Java 通过Flux.create/Flux.switchMap的可变间隔,java,project-reactor,Java,Project Reactor,我需要一个基于用户inpu的可变计时器。以下是最小的示例: Flux.<Integer> create(e -> { log.info("create"); // Never gets triggered e.next(2); // Sample user input: change to 2 second interval }) .switchMap(v -> Flux.interval(Duration.ofSeconds(v))) .star

我需要一个基于用户inpu的可变计时器。以下是最小的示例:

Flux.<Integer> create(e -> {
   log.info("create"); // Never gets triggered
   e.next(2); // Sample user input: change to 2 second interval
})
   .switchMap(v -> Flux.interval(Duration.ofSeconds(v)))
   .startWith(Flux.interval(Duration.ofSeconds(1)))
   .subscribe(e -> log.info("subscribe: {}", e)); // This works
Flux。创建(e->{
log.info(“create”);//永远不会被触发
e、 next(2);//示例用户输入:更改为2秒间隔
})
.switchMap(v->Flux.interval(持续时间秒(v)))
.startWith(通量间隔(持续时间秒(1)))
.subscribe(e->log.info(“subscribe:{}”,e));//这很有效
在上述情况下:

  • 我创建了一个
    Flux
    ,它应该根据用户输入发射东西(在上面的例子中,它只发射2个)
  • 然后在此基础上,使用
    switchMap
  • 以默认的1秒间隔开始
上述操作在
switchMap
部分下进行,即我看到它每秒都记录“subscribe:N”,但“create”不会被记录,并且
e.next(2)
也不会被调用


为什么这不起作用?对于这个用例有更好的解决方案吗?

如JavaDoc中所述,
Flux#startWith
在给定序列的前面

由于您将
Flux.interval(Duration.ofSeconds(1))
作为参数传递,它将每秒无限地发出long,并且基于
Flux.create的发布服务器将永远无法订阅

但是,如果将其更改为:

.startWith(单声道延迟(持续时间秒(1)))

您也可以考虑将代码更改为:

Flux。创建(e->{
log.info(“创建”);
e、 其次(2);
})
.startWith(1)
.switchMap(v->Flux.interval(持续时间秒(v)))
.subscribe(e->log.info(“subscribe:{}”,e));
在这里,我们在
通量之后使用
startWith
。创建
块,并让
开关映射将其作为任何其他信号处理

另外,请注意
switchMap(v->Flux.interval(Duration.ofSeconds(v))
的内容如下:
“每N秒开始发射一次,其中N是最新发射值”


如果你需要“延迟”它一次,考虑使用<代码>单声道。延迟< /代码>这里。< /P>啊,这是有意义的,谢谢!请注意,switchMap(v->Flux.interval(Duration.ofSeconds(v))的内容是:“每N秒开始发射一次,其中N是最新发射的值”,您能澄清一下您到底想到了什么警告吗?我不确定您的代码在做什么,并且猜测您可能希望进行一次性延迟,而不是更改速率,因此,大家都抬起头来