![Java编程方法论:响应式Spring Reactor 3设计与实现](https://wfqqreader-1252317822.image.myqcloud.com/cover/193/37669193/b_37669193.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.5 通过BaseSubscriber自定义订阅者
在前面的例子中,一直都通过在subscribe方法中添加参数来定义Subscriber,那么在这里会通过继承BaseSubscriber来实现一个自定义的Subscriber,请观察下面的简单实现:
![](https://epubservercos.yuewen.com/0950B0/19938710301519106/epubprivate/OEBPS/Images/39476_72_2.jpg?sign=1739004673-zvVTtOB2cgjnGgPoDELydukApnsiF4h1-0-a9a77ef6b6b96c1fb4955212c7ed396b)
为什么要重写这两个方法呢?下面先试着观察一下BaseSubscriber中我们经常会关心的几个点:
![](https://epubservercos.yuewen.com/0950B0/19938710301519106/epubprivate/OEBPS/Images/39476_72_3.jpg?sign=1739004673-PGMqIqKWKLSDSigbgYz195pY6f8KtfcV-0-d436d381d97e4173599d4b65fb7512fc)
![](https://epubservercos.yuewen.com/0950B0/19938710301519106/epubprivate/OEBPS/Images/39476_73_1.jpg?sign=1739004673-CbDmw62AvjqUZGkhFfGaFufkjsY1oMai-0-0ab4e1670d72a0ab2cd5395f253578c1)
可以知道,在参与订阅的时候,会先调用onSubscribe方法,通过这个回调方法就可以很容易地定义是使用推还是拉的方式。如果使用的是拉的方式,那么就在hookOnSubscribe回调方法内进行request方法调用。然后,执行重要的方法onNext,其中包含最重要的消费逻辑,所以必须重写hookOnNext回调方法。其实hookOnXXX方法都是空实现,需要根据自己的实际情况加以重写。下面展示一个很简单的实现,就不多做解释了。
于是,可以进行如下操作:
![](https://epubservercos.yuewen.com/0950B0/19938710301519106/epubprivate/OEBPS/Images/39476_73_2.jpg?sign=1739004673-ZtTCXtRSz3bS5ENPpgAimVbCs8oH10rR-0-bea3e89406563b294289f650bce2cd78)
输出如下:
![](https://epubservercos.yuewen.com/0950B0/19938710301519106/epubprivate/OEBPS/Images/39476_73_3.jpg?sign=1739004673-m102i193Y7wbhEJ53MnUCxuBXZdfyU89-0-d8bf7ee1e25c2dceac28379e7aa5c604)
同样,也可以在源的subscribe方法中使用匿名类实现BaseSubscriber:
![](https://epubservercos.yuewen.com/0950B0/19938710301519106/epubprivate/OEBPS/Images/39476_74_1.jpg?sign=1739004673-WcRrpWIerReAVWqd6Y6xF1UYIipnE9kZ-0-ff9d9fe1dc9afa7949171e6af2fabc09)
代码执行完毕,会得到与上面一样的结果,这里在hookOnSubscribe中使用了requestUnbounded方法,这也是BaseSubscriber提供的直接以Long类型的最大值进行请求的方式,其实际上还是调用了request(Long.MAX_VALUE))。这样,无形中就又回到了主动推的PUSH模式了。