特定のイベントが特定の時間間隔で「X」回発生した場合にプロセスを停止するユースケースがあります。
これを処理するためのメカニズムがJavaSpringFrameworkにありますか?
質問は非常に一般的であるため、いくつかの一般的なアドバイス:
TreeSet<Long>
イベントが発生したときのタイムスタンプを使用します。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 { }
上記の例では、イベントの発生率がかなり低い (5 分間で 10 件のイベント) ため、X タイムスタンプのキューを作成します。新しいメッセージが到着するたびに: