具有Completablefuture的API速率限制,用于异步处理

问题描述

我正在尝试处理API速率限制。我发现使用ratelimiter可以阻止资源的使用。因此,在下面的代码中,我试图只有两个线程,直到批处理(size)完成处理为止。

import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicInteger;
import com.google.common.util.concurrent.RateLimiter;

public class thenapply {
    public static void main(String[] args) throws InterruptedException,ExecutionException {
        List<Integer> list = Arrays.asList(1,2,3);
        final AtomicInteger sum = new AtomicInteger(0);
        final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second"
        int size = list.size();
        CountDownLatch latch = new CountDownLatch(size);
        for (int i = 0; i < size; i++) {
            final int finali = i;
            rateLimiter.acquire(); // should wait till I get 2 requests
            CompletableFuture.runAsync(() -> {
                int sq= newdoc(list.get(finali));
                sum.addAndGet(sq);
                latch.countDown();
            });
        }
        latch.await();
        System.out.println(sum);
    }

    public static int newdoc(int val){
        return val*val;
    }
}
  1. 实时地,当我们尝试使用该服务时,最终用户将尝试调用该服务,如果他多次调用该服务,则会引发一些错误。我们如何使用delay处理该问题。因此,基本上,目前我有两个使用ratelimiter的请求,之后将不处理任何请求。我如何将它们与delay排队?

  2. ratelimiter.acquire()什么时候可以自由提供资源?如果在处理完两个请求之后,那么latch.countDown循环之后我的for会怎样呢?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...