Каковы преимущества использования перехватчиков BaseSubscriber по сравнению с методами подписчика в Spring Reactor? - PullRequest
0 голосов
/ 25 апреля 2020

projectreactor.io / docs / core / release / reference В документации показана реализация BaseSubscriber в качестве альтернативы использованию лямбда-выражений в подписке, однако при чтении справочных документов: BaseSubscriber Я не вижу, как переопределение любого из хуков достигает того, чего не может переопределить Subscriber базовый метод. Почему мы должны использовать BaseSubscriber вообще?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Это будет полезно в ситуации, когда вам нужно больше контроля над потоком. Например, BaseSubscriber - это Disposable, который позволяет распоряжаться Subscription и генерировать событие onCancel. Он также реализует Subscription, который позволяет вам ограничить запрос , если подписчик запросил замедление или сделать его неограниченным на go.

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

EDIT:

onSubscribe() будет перехватывать всплывающее исключение и генерировать событие ошибки, если исключение перехватывается. Вариант использования hookOnSubscribe - это когда вы не хотите переопределять механизм исключений по умолчанию, но вам все равно нужно написать некоторый код после генерации события подписки, тогда вы можете использовать hookOnSubscribe. При переопределении hookOnSubscribe не забудьте позвонить subscription.request(somebound)

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

BaseSubscriber осуществляет учет и охрану в методах Subscriber, поэтому вам не нужно писать, что шаблон и беспокоиться о том, что шаблон корректен / охватывает все основы (например, защита от исключений в onNext / onSubscribe / et c ... и перевод указанных исключений в onError сигналы).

Обратите внимание, что при использовании лямбда-версий Flux#subscribe создается довольно похожий LambdaSubscriber с таким же образцом.

Тогда в обоих случаях вам, как разработчику, остается только реализовать бизнес-логику c. В одном случае это через предоставленные лямбды, а в случае BaseSubscriber - через реализацию методов hookXxx.

Основное различие между лямбда-подходом и подходом BaseSubscriber заключается в лямбдах, которые вы не можете состояние доступа, отличное от входного параметра лямбды. С BaseSubscriber мы специально фиксируем Subscription, и методы перехвата могут cancel() или request(n) этой подписки.

...