I am trying to use a Java Semaphore that calls an API. It will accept 100 data records per minute, regardless of the API waittime response.
I tried a Timed Semaphore
<code>private final TimedSemaphore semaphore = new TimedSemaphore(1, TimeUnit.MINUTE, 100);
int apiRequestSize = productRequest.size();
semaphore.tryAcquire(apiRequestSize);
productAPI(productRequest);
semaphore.release(apiRequestSize);
</code>
<code>private final TimedSemaphore semaphore = new TimedSemaphore(1, TimeUnit.MINUTE, 100);
int apiRequestSize = productRequest.size();
semaphore.tryAcquire(apiRequestSize);
productAPI(productRequest);
semaphore.release(apiRequestSize);
</code>
private final TimedSemaphore semaphore = new TimedSemaphore(1, TimeUnit.MINUTE, 100);
int apiRequestSize = productRequest.size();
semaphore.tryAcquire(apiRequestSize);
productAPI(productRequest);
semaphore.release(apiRequestSize);
However, timedSemaphore does not accept integers , it only increments by 1, and was intended for thread count.
Is there any library to make this work? Otherwise I can implement this, feel free to optimize or make better if other solutions..
<code>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.SECONDS);
}
public boolean tryAcquire() {
return semaphore.tryAcquire();
}
public void stop() {
scheduler.shutdown();
}
}
</code>
<code>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.SECONDS);
}
public boolean tryAcquire() {
return semaphore.tryAcquire();
}
public void stop() {
scheduler.shutdown();
}
}
</code>
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.SECONDS);
}
public boolean tryAcquire() {
return semaphore.tryAcquire();
}
public void stop() {
scheduler.shutdown();
}
}