我想用reactor实现:
for (val worker : getWorkers(request)) {
val response = worker.tryDo(work);
if (response != null) {
return response;
}
}
return null;
getWorkers
可以转移返回Flux<Worker>
,tryDo
也可以返回单声道。
关键是我想要一个或零个响应,如果当前的worker.tryDo
失败,只尝试下一个。
我需要哪个操作员?我在document找不到答案。
假设你可以重做tryWork来返回一个空的Mono,当没有工作而不是返回null时,你可以使用getWorkers(request).flatMap(worker -> worker.tryDo(work), 1).next()
1
的flatMap
参数指示它只考虑工人1乘1.返回空单声道的工人实际上不影响flatMap的输出。 Flux.next()
通过丢弃第一个元素并取消源代码来转换为Mono
。
我找到了一个来自@OlegDokuka的gitter中的答案:
Mono.fromDirect(workersFlux.concatMap(worker ->
Mono.justOrEmpty(worker.tryDo(work))).take(1))
更新:
感谢@SimonBaslé:使用singleOrEmpty
而不是fromDirect
。
workersFlux.concatMap(worker -> Mono.justOrEmpty(worker.tryDo(work))).take(1).singleOrEmpty()