public final class Throttler
extends java.lang.Object
Wird der Thread mit Thread.interrupt()
unterbrochen, beendet sich das Warten sofort
Constructor and Description |
---|
Throttler(java.time.Duration throttlePerCall,
java.time.Duration maxThrottleDuration)
Erstellt eine neuen Throttler zum Ausbremsen von häufigen Methodenaufrufen (z.
|
Modifier and Type | Method and Description |
---|---|
java.time.Duration |
getMaxThrottleDuration()
Gibt die maximale Wartezeit bei Verwendung eines einzelnen Threads zurück.
|
java.time.Duration |
getSlidingWindowLength()
Gibt die Länge des Sliding Window zurück.
|
java.time.Duration |
getThrottlePerCall()
Gibt die Wartezeit pro Methodenaufruf zurück.
|
void |
trigger()
Methode, deren Ausführung länger dauert, je öfter sie pro Zeitbereich aufgerufen wird.
|
void |
trigger(boolean addToQueue)
Methode, deren Ausführung länger dauert, je öfter sie pro Zeitbereich aufgerufen wird.
|
public Throttler(java.time.Duration throttlePerCall, java.time.Duration maxThrottleDuration)
Die Methode trigger()
dieser Klasse ist die wesentliche Methode. Je öfter sie aufgerufen wird, desto länger dauert es, bis die Methode
wieder verlassen wird.
Diese Klasse besitzt 2 Parameter:
- `throttlePerCall` gibt eine Zeitdauer an, die pro Login-Versuch in letzter Zeit gewartet wird. Gibt es beispielsweise in letzter Zeit 3 Login-Versuche, dann wird beim nächsten Login-Versuch die Dauer 3 * `throttlePerCall` gewartet. Gibt es keinen Login-Versuch in letzter Zeit wird die Methode sofort verlassen.
- `maxThrottleDuration` gibt die maximale Wartezeit an, die ein Thread ausgebremst wird. Da immer nur ein Thread gleichzeitig warten kann, kann
es bei mehreren parallelen Aufrufen der trigger()
-Methode zu entsprechend längeren Wartezeiten kommen (Anzahl Threads *
`maxThrottleDuration`)
Die Zeitdauer (Sliding Window), in der vorhergehende Methodenaufrufe zur Bestimmung der Wartedauer berücksichtigt werden, ergibt sich aus `maxThrottleDuration * (maxThrottleDuration / throttlePerCall)`. Das heißt, das gerade so viele Methodenaufrufe gemerkt werden, wie zum dauerhaften Beibehalten der `maxThrottleDuration` notwendig ist. Beispiel: maxThrottleDuration = 5 Sekunden, throttlePerCall = 1 Sekunde, dann müssen mindestens die letzten 5 * (5 / 1) = 25 Sekunden berücksichtigt werden, um bei dauerhaften Login-Versuchen eine konstante Wartezeit von 5 Sekunden beizubehalten.
throttlePerCall
- Zeitdauer, die pro Login-Versuch in letzter Zeit gewartet wirdmaxThrottleDuration
- maximale Wartezeit, die ein Thread ausgebremst wirdpublic void trigger()
throttlePerCall
for jeden vorhergehenden Methodenaufruf innerhalb des Sliding
Windows. Die Wartezeit ist maximal maxThrottleDuration
, kann allerdings bei parallelen Aufrufen aus mehreren
Threads noch länger sein, da sich nur ein Thread gleichzeitig in der Methode befinden (also gleichzeitig warten) darf.Sonst könnte man das Warten umgehen, indem man mehrere Threads gleichzeitig startet bzw. durch mehrere Verbindungen mehrere Threads erzeugt usw.
public void trigger(boolean addToQueue)
trigger()
.addToQueue
- Soll dieser Methodenaufruf dafür sorgen, dass folgende Aufrufe länger dauern? (`true` ist standard, falls `false` wird nur
gewartet)public java.time.Duration getSlidingWindowLength()
Die Zeitdauer (Sliding Window), in der vorhergehende Methodenaufrufe zur Bestimmung der Wartedauer berücksichtigt werden, ergibt sich aus `maxThrottleDuration * (maxThrottleDuration / throttlePerCall)`. Das heißt, das gerade so viele Methodenaufrufe gemerkt werden, wie zum dauerhaften Beibehalten der `maxThrottleDuration` notwendig ist. Beispiel: maxThrottleDuration = 5 Sekunden, throttlePerCall = 1 Sekunde, dann müssen mindestens die letzten 5 * (5 / 1) = 25 Sekunden berücksichtigt werden, um bei dauerhaften Login-Versuchen eine konstante Wartezeit von 5 Sekunden beizubehalten.
public java.time.Duration getThrottlePerCall()
public java.time.Duration getMaxThrottleDuration()