Java 按并发任务数限制异步Mono(不基于时间)

Java 按并发任务数限制异步Mono(不基于时间),java,project-reactor,Java,Project Reactor,假设我有一个方法,它接受一个参数并返回一个异步完成的Mono。例如: Random random = new Random(); ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(16); Mono<Integer> fetch(String a) { return Mono.create(em -> { scheduledExecutorSer

假设我有一个方法,它接受一个参数并返回一个异步完成的
Mono
。例如:

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);
  });
}
Random Random=new Random();
ScheduledExecutorService ScheduledExecutorService=Executors.newScheduledThreadPool(16);
单声道提取(字符串a){
返回Mono.create(em->{
scheduledExecutorService.schedule(()->em.next(a+“result”),
10+随机.nextInt(50),时间单位为毫秒);
});
}
假设我有一个
Flux
,我可以将它输入到上面的
fetch
方法中,它可以包含很多元素

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

例如,在上述示例中为4,虽然我有16个可用线程,但从这个角度来看,我始终保留12个备用线程。

假设“feed-to”,您的意思是您使用的是
flux.flatMap(this::fetch)
, 然后,您可以通过调用
flux.flatMap(this::fetch,4)
来设置flatMap并发性

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

  • fetch
    Mono
    的返回类型与您提供给接收器的项目类型不匹配(
    a+“result”
    )。我猜你的意思是单声道
  • MonoSink没有
    .next
    方法。我猜你的意思是
    。成功
  • 鉴于所有这些,这里有一个例子:

    private Flux fetchAll(){
    回流通量范围(0,50)
    .map(i->Integer.toString(i))
    .flatMap(this::fetch,4);
    }
    专用单声道提取(字符串a){
    返回Mono.create(em->
    scheduledExecutorService.schedule(()->em.success(a+“结果”),
    10+random.nextInt(50),时间单位为毫秒)
    );
    }