2013-01-18 73 views

回答

3

的问题是相当普遍的,所以一些一般性的建议:

  1. 使用时间戳的事件发生时的TreeSet<Long>;
  2. 在每个事件发生时,将其时间戳添加到该集并移除所有过期的条目(比时间早);
  3. 当设置的大小超过阈值时反应。

对于2.使用tailSet方法来快速消除过期的时间戳。

这是该方法的一个简单的例子:

public class OverloadGuard { 
    private SortedSet<Long> timestamps = new TreeSet<>(); 
    private final long timeout = TimeUnit.MINUTES.toMillis(5); 
    private final int threshold = 10; 
    public synchronized void event() { 
    final long now = System.currentTimeMillis(); 
    timestamps = timestamps.tailSet(now - timeout); 
    timestamps.add(now); 
    if (timestamps.size() > threshold) throw new OverloadException(); 
    } 
} 

class OverloadException extends RuntimeException { } 
+0

让我举个例子。如果在5分钟的时间间隔内发生10次事件,我想停止收到消息。 – user1703787

0

由于你上面的例子示出了事件的相当低的速率(10个事件在5分钟内),我想创建X的队列中的时间戳。

  1. 流行从队列如果是满
  2. 推到队列中的当前时间戳
  3. 如果堆栈已满,并且第x时间戳与第一时间戳之间的差为:到达每个新的消息在给定的时间间隔内发出警报!
相关问题