Flux - Cancelled 和 Terminated 不是相互排斥的吗?

Flux - Cancelled and Terminated not mutually exclusive?

我正在尝试围绕 Flux 执行包装跟踪跨度,并希望通过使用 doOnCancel 添加标记来特别处理“已取消”信号,同时我使用 doOnTerminate 定期终止 Flux。

那时我注意到有些情况下 Flux 被视为已取消,即使它也已终止。这是设计使然吗?我的理解是这些状态是相互排斥的。

Flux.just("a")
            .doOnCancel(() -> System.out.println("cancelled"))
            .doOnTerminate(() -> System.out.println("terminated"))
            .blockFirst();

这会打印:
已取消
已终止

有没有办法查明 Flux 是否被取消但没有终止?

这两个信号在 Reactive Streams 规范中确实不相互排斥:取消是异步的,可以在 Publisher 调用取消 SubscriberonComplete 时完成或 onError 方法,因此这两个副作用都被调用的可能性。

取消的 Subscription 甚至可能会推送一些 onNext 事件(从概念上讲,这样的 onNext 在订阅被取消的那一刻将处于“飞行中”)。