在给定的时间间隔内事件发生的次数

时间:2013-01-18 14:20:38

标签: java spring

如果发生特定事件,我有一个用例来停止进程' X'在给定的时间间隔内的时间。

java spring框架中是否有一个机制来处理这个问题?

2 个答案:

答案 0 :(得分:3)

这个问题非常笼统,所以有一些一般的建议:

  1. 事件发生时使用TreeSet<Long>个时间戳;
  2. 在每个事件发生时,将其时间戳添加到集合中并删除所有过期的条目(早于超时);
  3. 在设置大小超过阈值时做出反应。
  4. 对于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 { }
    

答案 1 :(得分:0)

由于上面的示例显示了相当低的事件率(5分钟内有10个事件),因此我将创建一个X时间戳队列。到达的每条新消息:

  1. 如果已满,则弹出队列
  2. 将当前时间戳推送到队列
  3. 如果堆栈已满且第X个时间戳与第一个时间戳之间的差异在给定的时间间隔内,请发出警告!