【问题标题】:Why would publisher send new items even after cancel?为什么发布者即使在取消后仍会发送新项目?
【发布时间】:2018-04-27 20:22:12
【问题描述】:

Subscription#cancel 的文档说

Data may still be sent to meet previously signalled demand after calling cancel.

  1. 在哪种情况下,人们会期望发布商继续发送直到满足之前的信号需求?
  2. 另外,如果我不想在取消后发送任何新商品,我该怎么办?

【问题讨论】:

    标签: rx-java2 project-reactor reactive-streams


    【解决方案1】:

    除非您正在创建低级运算符或Publishers,否则您不必担心这一点。

    在哪种情况下,人们会期望发布者继续发送直到满足先前的信号需求?

    主流的 Reactive Streams 库都没有这样做,因为它们最终会停止发送项目。 RxJava 2 和 Reactor 3 对此非常渴望,因此您很可能会在低杠杆异步发出的取消中添加一个额外的项目。 Akka Stream 可能发出的信号不止于此(上次我检查时,它们混合了控制和项目信号,并且每个流的最大同步项目有一个配置设置,这可能导致在取消生效之前发出多个项目)。

    另外,如果我不想在取消后发送任何新商品,我该怎么办?

    取决于您实现的内容:PublisherSubscriber

    Publisher 中,最急切的方法是设置volatile boolean cancelled fieldcheck that every time 你处于某种发射循环中。

    Subscriber 中,您可以在每个onXXX 中检查boolean done field,这样当您从onNext 调用Subscription.cancel() 时,任何后续调用will be ignored

    【讨论】:

    • 1.由于可以在任何线程上调用订阅者,所以 done 字段不应该也是volatile 吗? 2.在订阅者的情况下,当订阅被取消时,我没有看到有人设置done字段。我在这个例子中遗漏了什么吗?
    • 我说过当从 onNext 中调用取消时。如果允许外部取消,则必须使用 volatile。
    • 我指的是这个。这个 calss 允许外部取消,但 not done 不是 volatile 并且永远不会设置。请澄清github.com/ReactiveX/RxJava/blob/…
    • 设置在L83。另外,运算符本身不是某种生成器,因此它将取消信号传递到上游,因为在一对一运算符中急切检查已取消状态并没有直接好处。
    • 这取决于自定义运算符的作用。如果存在项目放大或异步边界,您应该直接对取消采取行动,并尽最大努力防止向下游发出信号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2020-02-21
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多