I am trying to handle the API rate limiting. I found that using ratelimiter
I can block the usage of resources. Hence, in the following code I am trying to have only two threads until the batch (size
) is completed processing.
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;
}
}
In real time when we are trying to use the service, the end-user will be trying to call the service and if he calls it multiple times, we are throwing some error. How can we handle that using the
delay
. So basically, currently I have two requests usingratelimiter
after that no request will be handled. how can I queue them with adelay
?When will
ratelimiter.acquire()
be free to give resources? If after the processing of two requests, then what about mylatch.countDown
as it is after thefor
loop?