响应式编程中Flux的doOnNext调用执行顺序是否有保障?
你示例代码里两个doOnNext的执行顺序是Reactor框架明确保障的,不需要担心顺序问题。
- Reactor的操作符会按照你声明的先后顺序组装成整条响应式处理链,每一个上游发出的元素都会沿着链条从上到下串行传递给每个操作符处理
- 对单个
Thing元素来说,必须等前一个doOnNext里的sendThing方法完全执行完成返回后,才会进入下一个doOnNext执行persistThing逻辑 - 注意只有当
sendThing是异步方法、内部自行开启独立线程执行逻辑的场景下,才会出现方法返回了但实际逻辑还没跑完的情况,这种时候才会打乱你预期的执行顺序
如果你的sendThing本身是异步逻辑、返回Mono<Void>这类Publisher类型的结果,建议不要用doOnNext处理,改用concatMap等操作符来保障异步逻辑的执行顺序,示例如下:
Flux<Thing> flux = ... // 等待sendThing的异步逻辑完全执行完成再往下走 .concatMap(thing -> sendThingAsync(thing).thenReturn(thing)) .doOnNext(this::persistThing) .doOnError(error -> log.error("", error)) .blockLast();
内容的提问来源于stack exchange,提问作者chacmool
相关产品推荐
相关产品推荐

