Reactor 更多核心-响应式编程-004

  🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓

  1. GitHub - apihug/apihug.com: All abou the Apihug   
  2. apihug.com: 有爱,有温度,有质量,有信任
  3. ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace

Disposable

subscribe() 调用会返回一个 Disposable 对象, Disposable 代表 当前的 subscription 可以通过调用 dispose() 来取消。

使用多线程模拟生产者生产的很快,然后立马取消订阅(虽然立刻取消但是由于生产者实在太快了,所以订阅者还是接收到了一些元素)。

其他的方法,比如 Disposables.composite() 会得到一个 Disposable 的集合,调用它的 dispose() 方法会把集合里的所有 Disposable 的 dispose() 方法都调用。

当然 Disposable 还有很多其他的功能接口,可以参考官方文档。

#Subscriber

如果我们穿进去是 Lambda 表达式, 创建的是 LambdaSubscriber Subscriber。

public final Disposable subscribe(
    @Nullable Consumer<? super T> consumer,
    @Nullable Consumer<? super Throwable> errorConsumer,
    @Nullable Runnable completeConsumer,
    @Nullable Context initialContext) {
  return subscribeWith(new LambdaSubscriber<>(consumer, errorConsumer,
      completeConsumer,
      null,
      initialContext));
}

继承 BaseSubscriber 可以当模板类使用, 只需要实现 hook* 函数来实现回调。

class MySubscriber<T> extends BaseSubscriber<T> {

  @Override
  protected void hookOnSubscribe(Subscription subscription) {
    LOGGER.debug("MY--Subscribed");
    request(1);
  }

  @Override
  protected void hookOnNext(T value) {
      LOGGER.debug("MY--VALUE:  " + value);
    request(1);
  }
}

@Test
void givenMySubscriber_test() {
  Flux.just(1, 2, 3, 4)
      .log()
      .map(
          i -> {
            LOGGER.debug("{}:{}", i, Thread.currentThread());
            return i * 2;
          })
      .subscribe(new MySubscriber());
}

然后可以看到输出:

  // | onSubscribe([Synchronous Fuseable]
  // ReactorIntegrationTest - MY--Subscribed
  // | request(1)
  // | onNext(1)
  // ReactorIntegrationTest - 1
  // ReactorIntegrationTest - MY--VALUE:  2
  // | request(1)
  // | onNext(2)
  // ReactorIntegrationTest - 2
  // ReactorIntegrationTest - MY--VALUE:  4
  // | request(1)
  // | onNext(3)
  // ReactorIntegrationTest - 3
  // ReactorIntegrationTest - MY--VALUE:  6
  // | request(1)
  // | onNext(4)
  // ReactorIntegrationTest - 4
  // ReactorIntegrationTest - MY--VALUE:  8
  // | request(1)
  // | onComplete()

默认 BaseSubscriber 直接 requestUnbounded

protected void hookOnSubscribe(Subscription subscription){
  subscription.request(Long.MAX_VALUE);
}

public final void requestUnbounded() {
  request(Long.MAX_VALUE);
}

#Backpressure

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值