個人的にはグァバを使います。しかし、先物を使用すると、あまり苦労せずに独自のものを作成できます。
class RateLimiter(delayMs: Int) {
private[this] var last: Long = System.currentTimeMillis
private[this] val done = scala.actors.Futures.alarm(0)
def request = {
val now = System.currentTimeMillis
val elapsed = synchronized {
val elapsed = now - last
last = if (elapsed < delayMs) last+delayMs else now
elapsed
}
if (elapsed < delayMs) scala.actors.Futures.alarm(delayMs-elapsed)
else done
}
}
次に、アクセスを制限する各メソッドまたはメソッドのセットに対してリミッタを作成し、 への呼び出しでメソッドを開始しrequest()
ます。これは、必要に応じて a を使用しFuture
てブロックします。少なくとも数ミリ秒の間隔以外のものが必要な場合は、少し計算を変更するか、もう少し状態を追跡する必要があります。