-3

特定のイベントが特定の時間間隔で「X」回発生した場合にプロセスを停止するユースケースがあります。

これを処理するためのメカニズムがJavaSpringFrameworkにありますか?

4

2 に答える 2

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 { }
于 2013-01-18T14:24:29.977 に答える
0

上記の例では、イベントの発生率がかなり低い (5 分間で 10 件のイベント) ため、X タイムスタンプのキューを作成します。新しいメッセージが到着するたびに:

  1. キューがいっぱいの場合は、キューをポップオフします
  2. 現在のタイムスタンプをキューにプッシュする
  3. スタックがいっぱいで、X 番目のタイムスタンプと 1 番目のタイムスタンプの差が指定された間隔内にある場合は、アラートを発行します。
于 2013-01-18T14:35:40.953 に答える