使用RxJava2正确处理背压和并发性
我有一个注册了回拨的服务,现在我想将其公开为使用RxJava2正确处理背压和并发性,java,design-patterns,rx-java,rx-java2,Java,Design Patterns,Rx Java,Rx Java2,我有一个注册了回拨的服务,现在我想将其公开为可流动的,具有某些要求/限制: 不应阻止接收回调的线程(工作应交给观察者指定的其他线程/调度程序) 不应该因为消费者的速度减慢而引发任何异常 多个消费者可以相互独立地订阅它 消费者可以选择缓冲所有项目,这样就不会丢失任何项目,但是不应该在“producer”类中缓冲这些项目 下面是我目前拥有的 class MyBroadcaster { private PublishProcessor<Packet> packets = Publi
可流动的
,具有某些要求/限制:
class MyBroadcaster {
private PublishProcessor<Packet> packets = PublishProcessor.create();
private Flowable<Packet> backpressuredPackets = packets.onBackpressureLatest();
public MyBroadcaster() {
//this is actually different to my exact use but same conceptually
registerCallback(packets::onNext);
}
public Flowable<Packet> observeAllPacketsOn(Scheduler scheduler) {
return backpressuredPackets.observeOn(scheduler);
}
}
class MyBroadcaster{
private PublishProcessor数据包=PublishProcessor.create();
private Flowable backpressuredPackets=packets.onBackpressureLatest();
公共广播公司(){
//这实际上与我的确切用法不同,但在概念上是相同的
registerCallback(数据包::onNext);
}
公共可流动observeAllPacketsOn(调度程序){
返回backpressuredPackets.observeOn(调度程序);
}
}
我不确定这是否符合我的要求。在onBackpressureLatest
javadoc上有一条关于observeOn
的注释,我不明白:
请注意,由于背压请求是如何通过subscribeOn/observeOn传播的,因此从下游请求1个以上的请求不能保证onNext事件的连续传递
我还有其他问题:
调用是否使项目不再进行多播onBackpressureLatest
- 如何测试我的需求
- 奖励:如果我有多个这样的发布者(在同一个类或其他地方),那么让相同模式可重用的最佳方法是什么。使用委派/额外方法创建我自己的可流动文件
observeSomePacketsOn
和observealpacketson
中应用onbackpressurelateest
或onBackpressureBuffer
,然后应用observeSomePacketsOn
OnBackPressureRelatest调用是否使项目不再进行多播
多播由PublishProcessor
完成,不同的订户将独立建立一个频道,其中OnBackPressurexx
和observeOn
运营商对单个订户生效
如何测试我的需求
使用TestSubscriber
(Flowable.test()
)通过有损或无损Flowable
订阅,将一组已知的数据包馈送到数据包中
,查看是否所有数据包都通过TestSubscriber.assertValueCount()
或TestSubscriber.values()
到达。有损耗的应为1。。N,在宽限期之后,无损的应该有N个值
奖励:如果我有多个这样的发布者(在同一个类或其他地方),那么让相同模式可重用的最佳方法是什么。使用委派/额外方法创建我自己的可流动文件
您可以将observeAllPacketsOn
转换为FlowableTransformer
,使用compose
代替MyBroadcaster上的方法调用,例如:
类别MyTransformers{
公共静态可流动变压器lossyObserveOn(调度器s){
返回f->f.onBackpressureLatest().observeOn(s);
}
}
新建MyBroadcaster().getPacketFlow()
.compose(MyTransformers.lossyObserveOn(调度程序))
.认购(/*…*/);
我不确定这是否符合我的要求
事实并非如此。分别在observeSomePacketsOn
和observealpacketson
中应用onbackpressurelateest
或onBackpressureBuffer
,然后应用observeSomePacketsOn
OnBackPressureRelatest调用是否使项目不再进行多播
多播由PublishProcessor
完成,不同的订户将独立建立一个频道,其中OnBackPressurexx
和observeOn
运营商对单个订户生效
如何测试我的需求
使用TestSubscriber
(Flowable.test()
)通过有损或无损Flowable
订阅,将一组已知的数据包馈送到数据包中
,查看是否所有数据包都通过TestSubscriber.assertValueCount()
或TestSubscriber.values()
到达。有损耗的应为1。。N,在宽限期之后,无损的应该有N个值
奖励:如果我有多个这样的发布者(在同一个类或其他地方),那么让相同模式可重用的最佳方法是什么。使用委派/额外方法创建我自己的可流动文件
您可以将observeAllPacketsOn
转换为FlowableTransformer
,使用compose
代替MyBroadcaster上的方法调用,例如:
类别MyTransformers{
公共静态可流动变压器lossyObserveOn(调度器s){
返回f->f.onBackpressureLatest().observeOn(s);
}
}
新建MyBroadcaster().getPacketFlow()
.compose(MyTransformers.lossyObserveOn(调度程序))
.认购(/*…*/);
在一个方法中调用onbackpressurexx
与一次调用并在所有用户中共享有什么不同?他们有什么干涉吗?感谢您的回答,对于rxjava github问题,这些问题问得更好吗?在方法中调用onBackPressureXXX
与在所有用户中共享一次有什么不同?他们有什么干涉吗?感谢您的回答,在rxjava上问这些问题更好吗