Class ThroughputLimit
- All Implemented Interfaces:
RuntimeType.Api<ThroughputLimitConfig>,Limit,LimitAlgorithm,SemaphoreLimit,NamedService,NamedService
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from interface io.helidon.common.concurrency.limits.LimitAlgorithm
LimitAlgorithm.Outcome, LimitAlgorithm.Result<T>, LimitAlgorithm.Token -
Field Summary
Fields -
Method Summary
Modifier and TypeMethodDescriptionbuilder()Create a new fluent API builder to constructThroughputLimitinstance.<T> LimitAlgorithm.Result<T> Invoke a callable within the limits of this limiter, invoking the providedConsumerwith theLimitAlgorithm.Outcomeresulting from applying the limit algorithm.copy()Create a copy of this limit with the same configuration.static ThroughputLimitcreate()Create a new instance with all defaults (no limit).static ThroughputLimitcreate(ThroughputLimitConfig config) Create a new instance from configuration.static ThroughputLimitDeprecated, for removal: This API element is subject to removal in a future version.static ThroughputLimitCreate a new instance from configuration.static ThroughputLimitCreate an instance from the provided semaphore.static ThroughputLimitcreate(Consumer<ThroughputLimitConfig.Builder> consumer) Create a new instance customizing its configuration.getClock()Returns the clock supplier used by this semaphore-based limit.protected AtomicIntegerReturns theAtomicIntegerinstance tracking the current number of concurrent requests.protected intReturns the initial number of permits set for this semaphore-based limit.protected StringgetName()Returns the name associated with this semaphore-based limit.protected intReturns the current queue length associated with this semaphore-based limit.protected SemaphoreReturns the underlying semaphore instance associated with this semaphore-based limit.voidInitialization method for this limit.voidDeprecated, for removal: This API element is subject to removal in a future version.Invoke a runnable within the limits of this limiter.<T> TDeprecated, for removal: This API element is subject to removal in a future version.Invoke a callable within the limits of this limiter.name()Name of this implementation, as provided inConfiguredProvider.create(io.helidon.common.config.Config, String).The prototype as it was received when creating this runtime object instance.Invoke a runnable within the limits of this limiter, invoking the providedConsumerwith theLimitAlgorithm.Outcomeresulting from applying the limit algorithm.Underlying semaphore of this limit.protected voidsetHandler(io.helidon.common.concurrency.limits.LimitHandlers.LimiterHandler handler) Sets theLimitHandlers.LimiterHandlerinstance to be used by this semaphore-based limit.protected voidsetInitialPermits(int initialPermits) Sets the initial number of permits for this semaphore-based limit.protected voidsetQueueLength(int queueLength) Sets the maximum number of requests that can be queued while waiting for a permit to be available.protected voidsetSemaphore(Semaphore semaphore) Sets the underlying semaphore instance associated with this semaphore-based limit.Deprecated, for removal: This API element is subject to removal in a future version.Try to acquire a token, waiting for available permits for the configured amount of time, if queuing is enabled.tryAcquire(boolean wait) Deprecated, for removal: This API element is subject to removal in a future version.Try to acquire a token, waiting for available permits for the configured amount of time, ifwaitis enabled, returning immediately otherwise.tryAcquireOutcome(boolean wait) Tries to acquire a token, waiting for available permits for the configured amount of time, ifwaitis enabled, returning immediately otherwise.type()Type of this implementation, to distinguish instances of same type, with differentNamedService.name().protected voidupdateMetrics(long startTime, long endTime) Updates the round-trip time (RTT) metric with the elapsed time between the specified start and end times.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface io.helidon.common.concurrency.limits.LimitAlgorithm
invoke, invoke, tryAcquire, tryAcquire, tryAcquireOutcome
-
Field Details
-
DEFAULT_AMOUNT
public static final int DEFAULT_AMOUNTDefault amount, meaning unlimited execution.- See Also:
-
DEFAULT_DURATION
Default duration over which to count operations.- See Also:
-
DEFAULT_QUEUE_LENGTH
public static final int DEFAULT_QUEUE_LENGTHDefault length of the queue.- See Also:
-
DEFAULT_QUEUE_TIMEOUT_DURATION
Timeout of a request that is enqueued.- See Also:
-
-
Method Details
-
builder
Create a new fluent API builder to constructThroughputLimitinstance.- Returns:
- fluent API builder
-
create
Create a new instance with all defaults (no limit).- Returns:
- a new limit instance
-
create
Create an instance from the provided semaphore.- Parameters:
semaphore- semaphore to use- Returns:
- a new throughput limit backed by the provided semaphore
-
create
Deprecated, for removal: This API element is subject to removal in a future version.usecreate(io.helidon.config.Config)insteadCreate a new instance from configuration.- Parameters:
config- configuration of the throughput limit- Returns:
- a new limit instance configured from
config
-
create
Create a new instance from configuration.- Parameters:
config- configuration of the throughput limit- Returns:
- a new limit instance configured from
config
-
create
Create a new instance from configuration.- Parameters:
config- configuration of the throughput limit- Returns:
- a new limit instance configured from
config
-
create
Create a new instance customizing its configuration.- Parameters:
consumer- consumer of configuration builder- Returns:
- a new limit instance configured from the builder
-
prototype
Description copied from interface:RuntimeType.ApiThe prototype as it was received when creating this runtime object instance.- Specified by:
prototypein interfaceRuntimeType.Api<ThroughputLimitConfig>- Returns:
- prototype object used to create this instance
-
name
Description copied from interface:NamedServiceName of this implementation, as provided inConfiguredProvider.create(io.helidon.common.config.Config, String).- Specified by:
namein interfaceNamedService- Specified by:
namein interfaceNamedService- Returns:
- name of this service
-
type
Description copied from interface:NamedServiceType of this implementation, to distinguish instances of same type, with differentNamedService.name(). Use for exampleConfiguredProvider.configKey()to define the type.- Specified by:
typein interfaceNamedService- Specified by:
typein interfaceNamedService- Returns:
- type of this service
-
copy
Description copied from interface:LimitCreate a copy of this limit with the same configuration. -
tryAcquireOutcome
Description copied from interface:LimitAlgorithmTries to acquire a token, waiting for available permits for the configured amount of time, ifwaitis enabled, returning immediately otherwise. Concrete implementations should invoke the providedoutcomeConsumer.Note that custom implementations of this interface might not implement this method, in which case the caller's limit outcome consumer receives an "unknown" outcome. Clearly the algorithm made a decision, but does not expose it to callers.
If acquired, the caller must call one of the
LimitAlgorithm.Tokenoperations to release the token. If the response is empty, the limit does not have an available token.- Specified by:
tryAcquireOutcomein interfaceLimitAlgorithm- Parameters:
wait- whether to wait in the queue (if one is configured/available in the limit), or to return immediately- Returns:
- acquired token, or empty if there is no available token
-
call
Description copied from interface:LimitAlgorithmInvoke a callable within the limits of this limiter, invoking the providedConsumerwith theLimitAlgorithm.Outcomeresulting from applying the limit algorithm.Note that custom implementations of this interface might not implement this method, in which case the caller's limit outcome consumer receives an "unknown" outcome. Clearly the algorithm made a decision, but does not expose it to callers.
Limitimplementor's notes:- Make sure to catch
IgnoreTaskExceptionfrom the callable, and call itsIgnoreTaskException.handle()to either return the provided result, or throw the exception after ignoring the timing for future decisions. - Make sure the
limitOutcomeConsumeris non-null, and after determining the disposition of the item of work create a suitableLimitOutcomeand pass it to the consumer. Also, make sure to use an outcome-aware token internally so when the caller invokes the token's methods the outcome is updated accordingly.
- Specified by:
callin interfaceLimitAlgorithm- Type Parameters:
T- the callable return type- Parameters:
callable- callable to execute within the limit- Returns:
- result of the callable with the outcome
- Throws:
Exception- in case the task failed with an exception
- Make sure to catch
-
run
Description copied from interface:LimitAlgorithmInvoke a runnable within the limits of this limiter, invoking the providedConsumerwith theLimitAlgorithm.Outcomeresulting from applying the limit algorithm.Note that custom implementations of this interface might not implement this method, in which case the caller's limit outcome consumer receives an "unknown" outcome. Clearly the algorithm made a decision, but does not expose it to callers.
Limitimplementor's notes:- Make sure to catch
IgnoreTaskExceptionfrom the runnable, and call itsIgnoreTaskException.handle()to either return the provided result, or throw the exception after ignoring the timing for future decisions. - Make sure the
limitOutcomeConsumeris non-null, and after determining the disposition of the item of work create a suitableLimitOutcomeand pass it to the consumer. Also, make sure to use an outcome-aware token internally so when the caller invokes the token's methods the outcome is updated accordingly.
- Specified by:
runin interfaceLimitAlgorithm- Parameters:
runnable- runnable to execute within the limit- Returns:
Outcomefrom the limit algorithm- Throws:
Exception- in case the task failed with an exception
- Make sure to catch
-
semaphore
Description copied from interface:SemaphoreLimitUnderlying semaphore of this limit.- Specified by:
semaphorein interfaceSemaphoreLimit- Returns:
- the semaphore instance
-
init
Description copied from interface:LimitInitialization method for this limit. This method can be used for any task, including metrics initialization. -
updateMetrics
protected void updateMetrics(long startTime, long endTime) Updates the round-trip time (RTT) metric with the elapsed time between the specified start and end times.The RTT is calculated as the difference between the end time and the start time. If the timer is not null, the RTT is recorded using the
Timer.record(long, TimeUnit)method with theTimeUnit.NANOSECONDSunit.- Parameters:
startTime- the start time of the operation in nanosecondsendTime- the end time of the operation in nanoseconds
-
setHandler
protected void setHandler(io.helidon.common.concurrency.limits.LimitHandlers.LimiterHandler handler) Sets theLimitHandlers.LimiterHandlerinstance to be used by this semaphore-based limit.The
LimiterHandleris responsible for managing the underlying semaphore and providing a way to acquire tokens.- Parameters:
handler- theLimitHandlers.LimiterHandlerinstance to be used
-
getInitialPermits
protected int getInitialPermits()Returns the initial number of permits set for this semaphore-based limit.The initial number of permits is used to initialize the underlying semaphore.
- Returns:
- the initial number of permits
-
setInitialPermits
protected void setInitialPermits(int initialPermits) Sets the initial number of permits for this semaphore-based limit.The initial number of permits is used to initialize the underlying semaphore.
- Parameters:
initialPermits- the initial number of permits to be set
-
getSemaphore
Returns the underlying semaphore instance associated with this semaphore-based limit.Note that direct access to the semaphore may bypass the limit calculation and is not recommended. This method is provided for backward compatibility only and is deprecated for removal.
- Returns:
- the underlying semaphore instance
-
setSemaphore
Sets the underlying semaphore instance associated with this semaphore-based limit.The semaphore is used to manage the concurrency limit. It is recommended to use the
LimitHandlers.LimiterHandlerinstance to acquire tokens instead of directly accessing the semaphore.- Parameters:
semaphore- the semaphore instance to be set
-
getConcurrentRequests
Returns theAtomicIntegerinstance tracking the current number of concurrent requests.The returned
AtomicIntegeris used to maintain a count of the concurrent requests being processed.- Returns:
- the
AtomicIntegerinstance tracking concurrent requests
-
getClock
Returns the clock supplier used by this semaphore-based limit.The clock supplier provides a way to obtain the current time in nanoseconds.
- Returns:
- the clock supplier
-
getName
Returns the name associated with this semaphore-based limit.The name is used to identify the limit and is typically used for metrics and monitoring purposes.
- Returns:
- the name of this semaphore-based limit
-
getQueueLength
protected int getQueueLength()Returns the current queue length associated with this semaphore-based limit.The queue length represents the maximum number of requests that can be queued while waiting for a permit to be available.
- Returns:
- the current queue length
-
setQueueLength
protected void setQueueLength(int queueLength) Sets the maximum number of requests that can be queued while waiting for a permit to be available.The queue length determines the number of requests that can be buffered when the concurrency limit is reached. If the queue is full, subsequent requests will be rejected.
- Parameters:
queueLength- the maximum number of requests to be queued
-
invoke
Deprecated, for removal: This API element is subject to removal in a future version.Description copied from interface:LimitAlgorithmInvoke a callable within the limits of this limiter.Limitimplementor's note: Make sure to catchIgnoreTaskExceptionfrom the callable, and call itsIgnoreTaskException.handle()to either return the provided result, or throw the exception after ignoring the timing for future decisions.- Specified by:
invokein interfaceLimitAlgorithm- Type Parameters:
T- the callable return type- Parameters:
callable- callable to execute within the limit- Returns:
- result of the callable
- Throws:
Exception- in case the task failed with an exception
-
invoke
Deprecated, for removal: This API element is subject to removal in a future version.Description copied from interface:LimitAlgorithmInvoke a runnable within the limits of this limiter.Limitimplementor's note: Make sure to catchIgnoreTaskExceptionfrom the runnable, and call itsIgnoreTaskException.handle()to either return the provided result, or throw the exception after ignoring the timing for future decisions.- Specified by:
invokein interfaceLimitAlgorithm- Parameters:
runnable- runnable to execute within the limit- Throws:
Exception- in case the task failed with an exception
-
tryAcquire
Deprecated, for removal: This API element is subject to removal in a future version.Description copied from interface:LimitAlgorithmTry to acquire a token, waiting for available permits for the configured amount of time, if queuing is enabled.If acquired, the caller must call one of the
LimitAlgorithm.Tokenoperations to release the token. If the response is empty, the limit does not have an available token.- Specified by:
tryAcquirein interfaceLimitAlgorithm- Returns:
- acquired token, or empty if there is no available token
-
tryAcquire
Deprecated, for removal: This API element is subject to removal in a future version.Description copied from interface:LimitAlgorithmTry to acquire a token, waiting for available permits for the configured amount of time, ifwaitis enabled, returning immediately otherwise.If acquired, the caller must call one of the
LimitAlgorithm.Tokenoperations to release the token. If the response is empty, the limit does not have an available token.- Specified by:
tryAcquirein interfaceLimitAlgorithm- Parameters:
wait- whether to wait in the queue (if one is configured/available in the limit), or to return immediately- Returns:
- acquired token, or empty if there is no available token
-
create(io.helidon.config.Config)instead