Временной семафор Java со счетчикомJAVA

Программисты JAVA общаются здесь
Anonymous
Временной семафор Java со счетчиком

Сообщение Anonymous »

Я пытаюсь использовать семафор Java, который вызывает API. Он будет принимать 100 записей данных в запросе API в минуту, независимо от времени ожидания ответа API.
Я попробовал использовать временный семафор

Код: Выделить всё

private final TimedSemaphore semaphore = new TimedSemaphore(1, TimeUnit.MINUTE, 100);

int apiRequestSize  = productRequest.size();
semaphore.tryAcquire(apiRequestSize);

productAPI(productRequest);

semaphore.release(apiRequestSize);
Однако timedSemaphore не принимает целые числа, он увеличивается только на 1 и предназначен для подсчета потоков.
Как я могу заставить это работать? В противном случае я могу реализовать это, не стесняйтесь добавлять лучшее/оптимизированное решение, если это возможно.

Код: Выделить всё

public class TimeSemaphore {
private final Semaphore semaphore;
private final ScheduledExecutorService scheduler;

public TimeSemaphore(int permitsPerSecond) {
this.semaphore = new Semaphore(permitsPerSecond);
this.scheduler = Executors.newScheduledThreadPool(1);

// Schedule a task to release permits every second
scheduler.scheduleAtFixedRate(() -> {
semaphore.release(permitsPerSecond - semaphore.availablePermits());
}, 0, 1, TimeUnit.MINUTE);
}

public boolean tryAcquire() {
return semaphore.tryAcquire();
}

public void stop() {
scheduler.shutdown();
}
}
RateLimiter не работает точно: поскольку он рассчитан на период в 1 секунду, а не на более длительный период.

Подробнее здесь: https://stackoverflow.com/questions/786 ... th-counter

Вернуться в «JAVA»