All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.allegro.tech.hermes.consumers.consumer.oauth.OAuthTokenRequestRateLimiter Maven / Gradle / Ivy

package pl.allegro.tech.hermes.consumers.consumer.oauth;

import com.google.common.util.concurrent.RateLimiter;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class OAuthTokenRequestRateLimiter {

    private final double initialRate;

    private final double minimalRate;

    private final double rateReductionFactor;

    private final RateLimiter rateLimiter;

    private final AtomicInteger rateReductionsCount = new AtomicInteger();

    public OAuthTokenRequestRateLimiter(double initialRate, double minimalRate, double rateReductionFactor,
                                        long warmUpPeriod) {
        this.initialRate = initialRate;
        this.rateLimiter = RateLimiter.create(initialRate, warmUpPeriod, TimeUnit.MILLISECONDS);
        this.minimalRate = minimalRate;
        this.rateReductionFactor = rateReductionFactor;
    }

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

    public void reduceRate() {
        rateReductionsCount.incrementAndGet();
        rateLimiter.setRate(Math.max(rateLimiter.getRate() / rateReductionFactor, minimalRate));
    }

    public void resetRate() {
        if (rateReductionsCount.get() > 0) {
            rateLimiter.setRate(initialRate);
            rateReductionsCount.set(0);
        }
    }

    public double getCurrentRate() {
        return rateLimiter.getRate();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy