diff --git a/common/pom.xml b/common/pom.xml index 7f9aa3d7b94a9944b78fbe0587597532e8eb8aa8..4a53aedb90eb9f70175567bb72c4042ea74840ea 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -16,6 +16,12 @@ + + org.springframework + spring-aspects + 4.3.2.RELEASE + provided + junit @@ -35,7 +41,6 @@ org.slf4j slf4j-api ${org.slf4j.version} - test org.slf4j @@ -49,6 +54,11 @@ ${org.slf4j.version} test + + com.google.guava + guava + 23.2-jre + diff --git a/common/src/main/java/org/genesys/glis/v1/GlisRateLimiter.java b/common/src/main/java/org/genesys/glis/v1/GlisRateLimiter.java new file mode 100644 index 0000000000000000000000000000000000000000..80ebe23b8fe0086a00e4d02fe30b8bfdab018322 --- /dev/null +++ b/common/src/main/java/org/genesys/glis/v1/GlisRateLimiter.java @@ -0,0 +1,35 @@ +package org.genesys.glis.v1; + +import com.google.common.util.concurrent.RateLimiter; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Aspect to control the rate of calls to GLIS API + */ +@Aspect +public class GlisRateLimiter { + + private static final Logger LOG = LoggerFactory.getLogger(GlisRateLimiter.class); + + private RateLimiter limiter = RateLimiter.create(20); + + public GlisRateLimiter(double permitsPerSecond) { + setPermitsPerSecond(permitsPerSecond); + } + + public void setPermitsPerSecond(double permitsPerSecond) { + limiter = RateLimiter.create(permitsPerSecond); + } + + @Before("execution(* org.genesys.glis.v1.api.*.*(..))") + public void rateLimit(JoinPoint jp) { + double delay = limiter.acquire(); + LOG.debug("Acquired rate limit permission ({} qps) in {} seconds for {}", limiter.getRate(), delay, jp.toLongString()); + } + +}