按并发任务数(非基于时间)进行节流异步Mono

时间:2019-04-12 22:09:26

标签: java project-reactor

说我有一个方法,该方法带有一个参数并返回一个异步完成的Mono<Integer>。例如:

Random random = new Random();
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(16);

Mono<Integer> fetch(String a) {
  return Mono.create(em -> {
    scheduledExecutorService.schedule(() -> em.next(a + " result"), 
      10 + random.nextInt(50), TimeUnit.MILLISECONDS);
  });
}

说我有一个Flux<String>,我可以将其添加到上面的fetch方法中,并且可以包含很多元素。

是否可以确保并行调用该方法,但是将并发调用的数量限制为预定义的数量?

例如在上面的示例中为4,而我有16个可用线程-因此从这个角度来看,我总是保留12个备用线程。

1 个答案:

答案 0 :(得分:2)

假设“馈入”,则表示您正在使用flux.flatMap(this::fetch), 那么您可以改为调用flux.flatMap(this::fetch, 4)来设置flatMap并发。

此外,您的代码有两个编译错误:

  1. 获取Mono<Integer>的返回类型与您提供给接收器的项目类型(a + " result")不匹配。我认为您是说Mono<String>
  2. MonoSink没有.next方法。我认为您是说.success

给出所有这些,下面是一个示例:

    private Flux<String> fetchAll() {
        return Flux.range(0, 50)
                .map(i -> Integer.toString(i))
                .flatMap(this::fetch, 4);

    }

    private Mono<String> fetch(String a) {
        return Mono.create(em ->
                scheduledExecutorService.schedule(() -> em.success(a + " result"),
                        10 + random.nextInt(50), TimeUnit.MILLISECONDS)
        );
    }