Rx java RxJava2 Flowable.create blockingSubscribe语义与backpressureStragy

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

我在理解可流动背压策略如何与blockingSubscribe方法一起工作时遇到了一些困难——或者我觉得这似乎出乎意料,如果有人能向我解释一下,我将不胜感激

我在当前主干中的
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的博客。