使用Guava RateLimiter类

时间:2015-08-07 17:45:19

标签: java guava throttling

我试图限制每秒调用一个方法的次数。 我尝试使用Guava RateLimiter来实现这一目标。

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

然而,呼叫的方法不限于每秒1次,而是连续的。

使用Thread.sleep()可以实现限制,但我希望使用Guava而不是sleep()。

我想知道使用Guava RateLimiter实现方法调用限制的正确方法。 我已经检查了RateLimiter的文档并试图使用相同的但无法达到预期的结果。

1 个答案:

答案 0 :(得分:20)

您需要在每次调用中在同一acquire()上致电RateLimiter,例如通过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");
    }
}

结果

  

Fri Aug 07 19:00:10 BST 2015:Beep
Friday May Jul 07 19:00:11 BST 2015:Beep
  Fri Aug 07 19:00:12 BST 2015:Beep
Fri Aug 07 07 19:00:13 BST 2015:Beep
  Fri Aug 07 19:00:14 BST 2015:Beep
Fri Aug 07 07 19:00:15 BST 2015:Beep
  Fri Aug 07 19:00:16 BST 2015:Beep
7月7日星期五19:00:17 BST 2015:Beep
  Fri Aug 07 19:00:18 BST 2015:Beep
Fri Aug 07 07 19:00:19 BST 2015:Beep