Throttling method calls using Guava RateLimiter class
Asked Answered
D

1

16

I am trying to throttle the number of calls to a method per second. I tried to achieve this using Guava RateLimiter.

RateLimiter rateLimiter = RateLimiter.create(1.0);//Max 1 call per sec
rateLimiter.acquire();
performOperation();//The method whose calls are to be throttled.

However the methods to the call are not limited to 1 per second but are continuous.

The throttling can be achieved using Thread.sleep() but i wish to use Guava rather that sleep().

I would like to know the right way to achieve the method call trottling using Guava RateLimiter. I have checked the documentation for RateLimiter and tried to use the same but could not achieve the desired result.

Dusk answered 7/8, 2015 at 17:45 Comment(1)
Are you creating a new RateLimiter before each invocation?Infallible
D
30

You need to call acquire() on the same RateLimiter in every invocation, e.g. by making it available in performOperation():

public class RateLimiterTest {
    public static void main(String[] args) {
        RateLimiter limiter = RateLimiter.create(1.0);
        for (int i = 0; i < 10; i++) {
            performOperation(limiter);
        }
    }

    private static void performOperation(RateLimiter limiter) {
        limiter.acquire();
        System.out.println(new Date() + ": Beep");
    }
}

results in

Fri Aug 07 19:00:10 BST 2015: Beep
Fri Aug 07 19:00:11 BST 2015: Beep
Fri Aug 07 19:00:12 BST 2015: Beep
Fri Aug 07 19:00:13 BST 2015: Beep
Fri Aug 07 19:00:14 BST 2015: Beep
Fri Aug 07 19:00:15 BST 2015: Beep
Fri Aug 07 19:00:16 BST 2015: Beep
Fri Aug 07 19:00:17 BST 2015: Beep
Fri Aug 07 19:00:18 BST 2015: Beep
Fri Aug 07 19:00:19 BST 2015: Beep

Dispensation answered 7/8, 2015 at 18:1 Comment(3)
Hi Jens The solution worked perfectly. However i would like to one thing. Incase if the number of method calls made is higher than the rate specified , will they be discarded or will all of them be executed at the rate specified in the RateLimiter?Dusk
rateLimiter.acquire() will wait the right amount of time until it's time for another operation to go through.Sturtevant
Hi sujith, acquire()'s documentation states that is blocks so they will all be executed at the specified rate (also, you wouldn't see 10 lines of output in my example if this wasn't the case)Dispensation

© 2022 - 2024 — McMap. All rights reserved.