Зачем издателю отправлять новые предметы даже после отмены? - PullRequest
0 голосов
/ 27 апреля 2018

В документации Подписка # отменить говорится, что

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

  1. В каком сценарии люди ожидают, что издатель продолжит посылать до тех пор, пока не будет удовлетворено предыдущее заявленное требование?
  2. Кроме того, если я не хочу, чтобы после отмены отправлялись какие-либо новые элементы, что мне делать?

1 Ответ

0 голосов
/ 27 апреля 2018

Если вы не создаете операторов низкого уровня или Publisher s, вам не нужно беспокоиться об этом.

В каком сценарии люди ожидают, что издатель продолжит посылать до тех пор, пока не будет удовлетворено предыдущее заявленное требование?

Ни одна из основных библиотек Reactive Streams не делает этого, поскольку они в конечном итоге прекращают отправку элементов. RxJava 2 и Reactor 3 очень заинтересованы в этом, так что у вас, скорее всего, будет дополнительный элемент в низкоуровневой асинхронно отмененной отмене. Akka Stream может сигнализировать больше, чем это (в прошлый раз, когда я проверял, они смешивают сигналы управления и элементы, и есть настройка конфигурации для максимального количества синхронных элементов на поток, что может привести к тому, что несколько элементов будут отправлены до того, как отмена вступит в силу).

Кроме того, если я не хочу, чтобы после отмены отправлялись какие-либо новые элементы, что мне делать?

Зависит от того, что вы реализуете: Publisher или Subscriber.

В Publisher самый жадный способ - установить volatile boolean cancelled поле и , чтобы каждый раз, когда находился в каком-либо цикле излучения.

В Subscriber вы можете иметь поле boolean done , которое проверяется в каждом onXXX, чтобы при вызове Subscription.cancel() из onNext любой последующий вызов будет игнорироваться .

...