web-dev-qa-db-ja.com

Guava RateLimiterクラスを使用したメソッド呼び出しの調整

1秒あたりのメソッドの呼び出し数を抑制しようとしています。私は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秒あたり1つに限定されず、継続的です。

スロットルはThread.sleep()を使用して達成できますが、sleep()ではなくGuavaを使用したいと思います。

Guava RateLimiterを使用してメソッド呼び出しの調整を実現する正しい方法を知りたいのですが。 RateLimiterのドキュメントを確認し、同じものを使用しようとしましたが、目的の結果を得ることができませんでした。

13
sujith

すべての呼び出しで、同じRateLimiterに対してacquire()を呼び出す必要があります。 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");
    }
}

結果は

2015年8月7日金曜日19:00:10 BST 2015:ビープ音
2015年8月7日金曜日19:00:11 BST 2015:ビープ音
2015年8月7日金曜日19:00:12 BST 2015:ビープ
2015年8月7日金曜日19:00:13 BST 2015:ビープ音
2015年8月7日金曜日19:00:14 BST 2015:ビープ音
2015年8月7日金曜日19:00:15 BST 2015:ビープ音
2015年8月7日金曜日19:00:16 BST 2015:ビープ音
2015年8月7日金曜日19:00:17 BST 2015:ビープ音
2015年8月7日金曜日19:00:18 BST 2015:ビープ音
2015年8月7日金曜日19:00:19 BST 2015:ビープ音

22
Jens Hoffmann