问题描述
我想像这样用反应堆写一些代码:
String callRemote(String server){
//remote call
...
}
List<String> servers = ...
String result = null;
for(String server: servers){
try{
result = callRemote(server); // should be called in sequence
if(result.equals("success")){
break;
}
}catch(TimeoutException e){ //timeout control
//
}
}
一开始,我认为Flux.takeWhile
是一个不错的选择,但是很难控制每个callRemote
的超时时间。
然后我尝试了Mono.zipwhen
和Mono.then
,但是我无法中断执行链。
解决方法
您可以使用filterWhen()
:
// return async first success
return Flux.just(servers).flatMap(this::connect)
.filterWhen(result -> Mono.just(result.equalsIgnoreCase("success"));
检查filterWhen()
的Javadoc