2013-01-18 117 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時間戳與第一時間戳之間的差爲:到達每個新的消息在給定的時間間隔內發出警報!
相關問題