Java 通过Flux.create/Flux.switchMap的可变间隔
我需要一个基于用户inpu的可变计时器。以下是最小的示例: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
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));//这很有效
在上述情况下:
- 我创建了一个
,它应该根据用户输入发射东西(在上面的例子中,它只发射2个)Flux
- 然后在此基础上,使用
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是最新发射的值”,您能澄清一下您到底想到了什么警告吗?我不确定您的代码在做什么,并且猜测您可能希望进行一次性延迟,而不是更改速率,因此,大家都抬起头来