Rx java RxJava2 Flowable.create blockingSubscribe语义与backpressureStragy
我在理解可流动背压策略如何与blockingSubscribe方法一起工作时遇到了一些困难——或者我觉得这似乎出乎意料,如果有人能向我解释一下,我将不胜感激 我在当前主干中的Rx java RxJava2 Flowable.create blockingSubscribe语义与backpressureStragy,rx-java,rx-java2,Rx Java,Rx Java2,我在理解可流动背压策略如何与blockingSubscribe方法一起工作时遇到了一些困难——或者我觉得这似乎出乎意料,如果有人能向我解释一下,我将不胜感激 我在当前主干中的FlowableTests文件中测试此代码 @Test public void testCreateBackpressureDrop() { Flowable.create(new FlowableOnSubscribe<Integer>() { @Override pub
FlowableTests
文件中测试此代码
@Test
public void testCreateBackpressureDrop() {
Flowable.create(new FlowableOnSubscribe<Integer>() {
@Override
public void subscribe(FlowableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(3);
e.onNext(4);
e.onComplete();
}
}, BackpressureStrategy.DROP).blockingSubscribe(w);
verify(w, times(1)).onNext(1);
verify(w, times(1)).onNext(3);
verify(w, times(1)).onNext(4);
verify(w, times(1)).onComplete();
}
@测试
public void testCreateBackpressureDrop(){
创建(新的FlowableOnSubscribe(){
@凌驾
public void subscribe(FlowTablee)引发异常{
e、 onNext(1);
e、 onNext(3);
e、 onNext(4);
e、 onComplete();
}
},背压平衡。下降)。阻塞订阅(w);
验证(w,次(1)).onNext(1);
验证(w,次(1)).onNext(3);
验证(w,乘以(1)).onNext(4);
验证(w,乘以(1)).onComplete();
}
如果我使用subscribe(w)
和BackpressureStragegy.DROP
或Backpressure.BUFFER
测试通过。但是,如果我使用blockingSubscribe(w)
,Backpressure.BUFFER
通过,但Backpressure.DROP
失败,表示从未调用onNext(1)
谢谢 这是使用Mockito模拟
订阅者的典型问题:您必须在其订阅中调用请求(N)
:
@SuppressWarnings("unchecked")
public static <T> Subscriber<T> mockSubscriber() {
Subscriber<T> w = mock(Subscriber.class);
Mockito.doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock a) throws Throwable {
Subscription s = a.getArgument(0);
s.request(Long.MAX_VALUE);
return null;
}
}).when(w).onSubscribe((Subscription)any());
return w;
}
@SuppressWarnings(“未选中”)
公共静态订阅服务器mockSubscriber(){
Subscriber w=mock(Subscriber.class);
Mockito.doAnswer(新答案(){
@凌驾
公共对象应答(InvocationMock a)抛出Throwable{
订阅s=a.getArgument(0);
s、 请求(长最大值);
返回null;
}
}).当(w).认购((认购)任何());
返回w;
}
blockingSubscribe
的复杂之处在于,它在FlowableOnSubscribe
运行之后执行上面的w.onSubscribe
。这是使用Mockito模拟订户的典型问题:您必须在其onSubscribe
中调用请求(N)
:
@SuppressWarnings("unchecked")
public static <T> Subscriber<T> mockSubscriber() {
Subscriber<T> w = mock(Subscriber.class);
Mockito.doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock a) throws Throwable {
Subscription s = a.getArgument(0);
s.request(Long.MAX_VALUE);
return null;
}
}).when(w).onSubscribe((Subscription)any());
return w;
}
@SuppressWarnings(“未选中”)
公共静态订阅服务器mockSubscriber(){
Subscriber w=mock(Subscriber.class);
Mockito.doAnswer(新答案(){
@凌驾
公共对象应答(InvocationMock a)抛出Throwable{
订阅s=a.getArgument(0);
s、 请求(长最大值);
返回null;
}
}).当(w).认购((认购)任何());
返回w;
}
blockingSubscribe
的复杂之处在于,在FlowableOnSubscribe
运行之后,它执行上面的w.onSubscribe
。是否期望在正常代码(非测试代码)的onSubscribe
中调用s.request(N)
?有没有关于这方面的有用文档?谢谢如果您通过订户实现它,则是DisposableSubscriber
和ResourceSubscriber
为您做这件事。如果您熟悉rxjava1,请参阅。除此之外,到处都有关于RxJava 2的博客。是否期望在正常代码(非测试代码)的onSubscribe
中调用s.request(N)
?有没有关于这方面的有用文档?谢谢如果您通过订户实现它,则是DisposableSubscriber
和ResourceSubscriber
为您做这件事。如果您熟悉rxjava1,请参阅。除此之外,到处都有关于rxjava2的博客。