Class SingleEndpointPool<E>
java.lang.Object
org.glassfish.grizzly.connectionpool.SingleEndpointPool<E>
- Type Parameters:
E- the address type, for example for TCP transport it'sSocketAddress
The single endpoint
Connection pool implementation, in other words
this pool manages Connections to one specific endpoint.
The endpoint address has to be represented by an objected understandable by
a ConnectorHandler passed to the constructor. For example the
endpoint address has to be represented by SocketAddress for
TCPNIOConnectorHandler and UDPNIOConnectorHandler.
There are number of configuration options supported by the SingleEndpointPool:
- corePoolSize: the number of Connections to be kept in the pool and never timed out
because of keep-alive setting;
- maxPoolSize: the maximum number of Connections to be kept by the pool;
- keepAliveTimeoutMillis: the maximum number of milliseconds an idle Connection
will be kept in the pool. The idle Connections will be
closed till the pool size is greater than corePoolSize;
- keepAliveCheckIntervalMillis: the interval, which specifies how often the pool will
perform idle Connections check;
- reconnectDelayMillis: the delay to be used before the pool will repeat the attempt to connect to
the endpoint after previous connect had failed.
- asyncPollTimeoutMillis: maximum amount of time, after which
the async connection poll operation will
be failed with a timeout exception
- connectionTTLMillis: the maximum amount of time, a
Connection could be associated with the pool- Author:
- Alexey Stashok
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static final classstatic classThe Builder class responsible for constructingSingleEndpointPool.protected static final classprotected static final classConnect timeout mechanism classes related to DelayedExecutor.protected static final classprotected static final classprotected static final classConnect timeout mechanism classes related to DelayedExecutor.protected static final classKeep-alive mechanism classes related to DelayedExecutor.protected static final classprotected static final classprotected static final classReconnect mechanism classes related to DelayedExecutor.protected static final classprotected static final class -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final intThe max number ofConnections kept by this poolprotected intNumber of connections we're currently trying to establish and waiting for the result -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedSingleEndpointPool(Endpoint<E> endpoint, int corePoolSize, int maxPoolSize, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<SingleEndpointPool.ConnectTimeoutTask> connectTimeoutQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<SingleEndpointPool.ReconnectTask> reconnectQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<SingleEndpointPool.KeepAliveCleanerTask> keepAliveCleanerQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<Link<SingleEndpointPool.AsyncPoll>> asyncPollTimeoutQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<ConnectionInfo> connectionTTLQueue, long connectTimeoutMillis, long keepAliveTimeoutMillis, long keepAliveCheckIntervalMillis, long reconnectDelayMillis, int maxReconnectAttempts, long asyncPollTimeoutMillis, long connectionTTLMillis, boolean failFastWhenMaxSizeReached) Constructs SingleEndpointPool instance.protectedSingleEndpointPool(Endpoint<E> endpoint, int corePoolSize, int maxPoolSize, org.glassfish.grizzly.utils.DelayedExecutor delayedExecutor, long connectTimeoutMillis, long keepAliveTimeoutMillis, long keepAliveCheckIntervalMillis, long reconnectDelayMillis, int maxReconnectAttempts, long asyncPollTimeoutMillis, long connectionTTLMillis, boolean failFastWhenMaxSizeReached) Constructs SingleEndpointPool instance. -
Method Summary
Modifier and TypeMethodDescriptionbooleanattach(org.glassfish.grizzly.Connection connection) Attaches "foreign"Connectionto the pool.static <T> SingleEndpointPool.Builder<T>Returns single endpoint poolSingleEndpointPool.Builder.protected booleanThe method is called before the pool will try to establish new client connection.voidclose()Closes the pool and release associated resources.protected booleanChecks if it's possible to create a newConnectionby callingcheckBeforeOpeningConnection()and if it is possible - establish new connection.booleandetach(org.glassfish.grizzly.Connection connection) Detaches aConnectionfrom the pool.longgetAsyncPollTimeout(TimeUnit timeUnit) getConnectionInfo(org.glassfish.grizzly.Connection connection) Returns pooledConnectionInfo, that might be used for monitoring reasons, or null if theConnectiondoes not belong to this pool.longgetConnectionTTL(TimeUnit timeUnit) Return the maximum amount of time, aConnectioncould be associated with the pool.longgetConnectTimeout(TimeUnit timeUnit) intlonggetKeepAliveCheckInterval(TimeUnit timeUnit) longgetKeepAliveTimeout(TimeUnit timeUnit) Returns the maximum amount of time an idleConnectionwill be kept in the pool.intintintintlonggetReconnectDelay(TimeUnit timeUnit) protected intbooleanisBusy(org.glassfish.grizzly.Connection connection) Returns true only if theConnectionis registered in the pool and is currently in busy state (used by a user), otherwise returns false.booleanbooleanbooleanisRegistered(org.glassfish.grizzly.Connection connection) Returns true if theConnectionis registered in the pool no matter if it's currently in busy or ready state, or false if theConnectionis not registered in the pool.org.glassfish.grizzly.Connectionpoll()booleanrelease(org.glassfish.grizzly.Connection connection) Returns theConnectionto the pool.intsize()Returns the current pool size.org.glassfish.grizzly.GrizzlyFuture<org.glassfish.grizzly.Connection>take()Obtains aConnectionfrom the pool in non-blocking/asynchronous fashion.voidtake(org.glassfish.grizzly.CompletionHandler<org.glassfish.grizzly.Connection> completionHandler) Obtains aConnectionfrom the pool in non-blocking/asynchronous fashion.toString()
-
Field Details
-
maxPoolSize
protected final int maxPoolSizeThe max number ofConnections kept by this pool -
pendingConnections
protected int pendingConnectionsNumber of connections we're currently trying to establish and waiting for the result
-
-
Constructor Details
-
SingleEndpointPool
protected SingleEndpointPool(Endpoint<E> endpoint, int corePoolSize, int maxPoolSize, org.glassfish.grizzly.utils.DelayedExecutor delayedExecutor, long connectTimeoutMillis, long keepAliveTimeoutMillis, long keepAliveCheckIntervalMillis, long reconnectDelayMillis, int maxReconnectAttempts, long asyncPollTimeoutMillis, long connectionTTLMillis, boolean failFastWhenMaxSizeReached) Constructs SingleEndpointPool instance.- Parameters:
endpoint-Endpointto be used to establish newConnectionscorePoolSize- the number ofConnections, kept in the pool, that are immune to keep-alive mechanismmaxPoolSize- the max number ofConnections kept by this pooldelayedExecutor- customDelayedExecutorto be used by keep-alive and reconnect mechanismsconnectTimeoutMillis- timeout, after which, if a connection is not established, it is considered failedkeepAliveTimeoutMillis- the maximum number of milliseconds an idleConnectionwill be kept in the poolkeepAliveCheckIntervalMillis- the interval, which specifies how often the pool will perform idleConnections checkreconnectDelayMillis- the delay to be used before the pool will repeat the attempt to connect to the endpoint after previous connect had failedmaxReconnectAttempts- the maximum number of reconnect attempts that may be made before failure notification.asyncPollTimeoutMillis- the maximum time, the async poll operation could wait for a connection to become availableconnectionTTLMillis- the maximum time, a connection could stay registered with the poolfailFastWhenMaxSizeReached- true if the "take" method should fail fast if there is no free connection in the pool and max pool size is reached
-
SingleEndpointPool
protected SingleEndpointPool(Endpoint<E> endpoint, int corePoolSize, int maxPoolSize, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<SingleEndpointPool.ConnectTimeoutTask> connectTimeoutQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<SingleEndpointPool.ReconnectTask> reconnectQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<SingleEndpointPool.KeepAliveCleanerTask> keepAliveCleanerQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<Link<SingleEndpointPool.AsyncPoll>> asyncPollTimeoutQueue, org.glassfish.grizzly.utils.DelayedExecutor.DelayQueue<ConnectionInfo> connectionTTLQueue, long connectTimeoutMillis, long keepAliveTimeoutMillis, long keepAliveCheckIntervalMillis, long reconnectDelayMillis, int maxReconnectAttempts, long asyncPollTimeoutMillis, long connectionTTLMillis, boolean failFastWhenMaxSizeReached) Constructs SingleEndpointPool instance.- Parameters:
endpoint-Endpointto be used to establish newConnectionscorePoolSize- the number ofConnections, kept in the pool, that are immune to keep-alive mechanismmaxPoolSize- the max number ofConnections kept by this poolconnectTimeoutQueue- theDelayedExecutor.DelayQueueused by connect timeout mechanismreconnectQueue- theDelayedExecutor.DelayQueueused by reconnect mechanismkeepAliveCleanerQueue- theDelayedExecutor.DelayQueueused by keep-alive mechanismasyncPollTimeoutQueue- theDelayedExecutor.DelayQueueused by async connection poll mechanismconnectionTTLQueue- theDelayedExecutor.DelayQueueused by connection TTL mechanismconnectTimeoutMillis- timeout, after which, if a connection is not established, it is considered failedkeepAliveTimeoutMillis- the maximum number of milliseconds an idleConnectionwill be kept in the poolkeepAliveCheckIntervalMillis- the interval, which specifies how often the pool will perform idleConnections checkreconnectDelayMillis- the delay to be used before the pool will repeat the attempt to connect to the endpoint after previous connect had failedmaxReconnectAttempts- the maximum number of reconnect attempts that may be made before failure notification.asyncPollTimeoutMillis- the maximum time, the async poll operation could wait for a connection to become availableconnectionTTLMillis- the maximum time, a connection could stay registered with the poolfailFastWhenMaxSizeReached- true if the "take" method should fail fast if there is no free connection in the pool and max pool size is reached
-
-
Method Details
-
builder
Returns single endpoint poolSingleEndpointPool.Builder.- Type Parameters:
T- endpoint type- Parameters:
endpointType- endpoint address type, for exampleSocketAddressfor TCP and UDP transports- Returns:
SingleEndpointPool.Builder
-
getEndpoint
- Returns:
- the endpoint description
-
getCorePoolSize
public int getCorePoolSize()- Returns:
- the number of
Connections, kept in the pool, that are immune to keep-alive mechanism
-
getMaxPoolSize
public int getMaxPoolSize()- Returns:
- the max number of
Connections kept by this pool
-
getConnectTimeout
- Parameters:
timeUnit-TimeUnit- Returns:
- the connection timeout, after which, if a connection is not established, it is considered failed
-
getReconnectDelay
- Parameters:
timeUnit-TimeUnit- Returns:
- the delay to be used before the pool will repeat the attempt to connect to the endpoint after previous attempt fail
-
getMaxReconnectAttempts
public int getMaxReconnectAttempts()- Returns:
- the maximum number of reconnect attempts
-
getKeepAliveTimeout
Returns the maximum amount of time an idleConnectionwill be kept in the pool. The idleConnections will be closed till the pool size is greater than corePoolSize.- Parameters:
timeUnit-TimeUnit- Returns:
- the maximum amount of time an idle
Connectionwill be kept in the pool
-
getKeepAliveCheckInterval
- Parameters:
timeUnit-TimeUnit- Returns:
- the interval, which specifies how often the pool will perform idle
Connections check
-
getAsyncPollTimeout
- Parameters:
timeUnit-TimeUnit- Returns:
- the timeout, after which, the async connection poll operation will fail with a timeout exception
-
getConnectionTTL
Return the maximum amount of time, aConnectioncould be associated with the pool. Once timeout is hit - the connection will be either closed, if it's idle, or detached from the pool, if it's being used.- Parameters:
timeUnit-TimeUnit- Returns:
- the maximum amount of time, a
Connectioncould be associated with the pool
-
isFailFastWhenMaxSizeReached
public boolean isFailFastWhenMaxSizeReached()- Returns:
- true, if the "take" method will fail fast if there is no free connection in the pool and max pool size is reached
-
size
public int size()Returns the current pool size. This value includes connected and connecting (connect in progress)Connections.- Returns:
- the current pool size
-
getOpenConnectionsCount
public int getOpenConnectionsCount()- Returns:
- the number of connected
Connections in the pool. Unlikesize()the value doesn't include connecting (connect in progress)Connections.
-
getReadyConnectionsCount
public int getReadyConnectionsCount()- Returns:
- the number of
Connections ready to be retrieved and used.
-
isMaxCapacityReached
public boolean isMaxCapacityReached()- Returns:
- true is maximum number of
Connections the pool can keep is reached and no newConnectioncan be established, or false otherwise.
-
isRegistered
public boolean isRegistered(org.glassfish.grizzly.Connection connection) Returns true if theConnectionis registered in the pool no matter if it's currently in busy or ready state, or false if theConnectionis not registered in the pool.- Parameters:
connection-Connection- Returns:
- true if the
Connectionis registered in the pool no matter if it's currently in busy or ready state, or false if theConnectionis not registered in the pool
-
isBusy
public boolean isBusy(org.glassfish.grizzly.Connection connection) Returns true only if theConnectionis registered in the pool and is currently in busy state (used by a user), otherwise returns false.- Parameters:
connection-Connection- Returns:
- true only if the
Connectionis registered in the pool and is currently in busy state (used by a user), otherwise returns false
-
getConnectionInfo
Returns pooledConnectionInfo, that might be used for monitoring reasons, or null if theConnectiondoes not belong to this pool.- Parameters:
connection-Connection- Returns:
- pooled
ConnectionInfo, that might be used for monitoring reasons, or null if theConnectiondoes not belong to this pool
-
take
public org.glassfish.grizzly.GrizzlyFuture<org.glassfish.grizzly.Connection> take()Obtains aConnectionfrom the pool in non-blocking/asynchronous fashion. Returns aGrizzlyFuturerepresenting the pending result of the non-blocking/asynchronous obtain task. Future's get method will return theConnectiononce it becomes available in the pool.If you would like to immediately block waiting for a
Connection, you can use constructions of the form connection = pool.take().get();Note: returned
GrizzlyFuturemust be checked and released properly. It must not be forgotten, because aConnection, that might be assigned as a result ofGrizzlyFuturehas to be returned to the pool. If you gave up on waiting for aConnectionor you are not interested in theConnectionanymore, the proper release code has to look like:if (!future.cancel(false)) { // means Connection is ready pool.release(future.get()); }- Returns:
GrizzlyFuture
-
take
public void take(org.glassfish.grizzly.CompletionHandler<org.glassfish.grizzly.Connection> completionHandler) Obtains aConnectionfrom the pool in non-blocking/asynchronous fashion. The passedCompletionHandlerwill be notified about the result of the non-blocking/asynchronous obtain task.- Parameters:
completionHandler- to be notified onceConnectionis available or an error occurred
-
poll
- Returns:
- a
Connectionfrom the pool, if there is one available at the moment, or null otherwise - Throws:
IOException- if the pool is closed
-
release
public boolean release(org.glassfish.grizzly.Connection connection) Returns theConnectionto the pool. TheConnectionwill be returned to the pool only in case it was created by this pool, or it was attached to it usingattach(org.glassfish.grizzly.Connection)method. If theConnectionis not registered in the pool - it will be closed. If theConnectionis registered in the pool and already marked as ready - this method call will not have any effect. If theConnectionwas returned - it is illegal to use it until it is retrieved from the pool again.- Parameters:
connection- theConnectionto return- Returns:
trueif the connection was successfully released. If the connection cannot be released, the connection will be closed andfalsewill be returned.
-
attach
Attaches "foreign"Connectionto the pool. This method might be used to add to the pool aConnection, that either has not been created by this pool or has been detached. After calling this method, theConnectioncould be still used by the caller andrelease(org.glassfish.grizzly.Connection)should be called to return theConnectionto the pool so it could be reused.- Parameters:
connection-Connection- Returns:
- true if the
Connectionhas been successfully attached, or false otherwise. If theConnectionhad been already registered in the pool - the method call doesn't have any effect and true will be returned. - Throws:
IOException- thrown if this pool has been already closed
-
detach
public boolean detach(org.glassfish.grizzly.Connection connection) Detaches aConnectionfrom the pool. De-registers theConnectionfrom the pool and decreases the pool size by 1. It is possible to re-attach the detachedConnectionlater by callingattach(org.glassfish.grizzly.Connection). If theConnectionwas not registered in the pool - the method call doesn't have any effect.- Parameters:
connection- theConnectionto detach- Returns:
trueif the connection was successfully detached from this pool, otherwise returnsfalse
-
close
public void close()Closes the pool and release associated resources. The readyConnections will be closed, the busyConnection, that are still in use - will be kept open and will be automatically closed when returned to the pool byrelease(org.glassfish.grizzly.Connection). -
checkBeforeOpeningConnection
protected boolean checkBeforeOpeningConnection()The method is called before the pool will try to establish new client connection. Please note, if the method returns true it also increases thependingConnectionscounter, so don't forget to decrease it, if needed.- Returns:
- true if new connection could be created, or false otherwise
-
getWaitingListSize
protected int getWaitingListSize()- Returns:
- the number of consumers waiting for a connection
-
createConnectionIfPossible
protected boolean createConnectionIfPossible()Checks if it's possible to create a newConnectionby callingcheckBeforeOpeningConnection()and if it is possible - establish new connection.- Returns:
- true if a new
Connectioncould be open, or false otherwise
-
toString
-