private PerRoutePool<T, C> getPool(final T route) { PerRoutePool<T, C> pool = this.routeToPool.get(route); if (pool == null) { pool = new PerRoutePool<>(route); this.routeToPool.put(route, pool); } return pool; }
private void purgePoolMap() { final Iterator<Map.Entry<T, PerRoutePool<T, C>>> it = this.routeToPool.entrySet().iterator(); while (it.hasNext()) { final Map.Entry<T, PerRoutePool<T, C>> entry = it.next(); final PerRoutePool<T, C> pool = entry.getValue(); if (pool.getAllocatedCount() == 0) { it.remove(); } } }
@Override public void close(final CloseMode closeMode) { if (this.isShutDown.compareAndSet(false, true)) { fireCallbacks(); this.lock.lock(); try { for (final PerRoutePool<T, C> pool: this.routeToPool.values()) { pool.shutdown(closeMode); } this.routeToPool.clear(); this.leased.clear(); this.available.clear(); this.leasingRequests.clear(); } finally { this.lock.unlock(); } } }
PoolEntry<T, C> entry; for (;;) { entry = pool.getFree(state); if (entry == null) { break; entry.discardConnection(CloseMode.GRACEFUL); this.available.remove(entry); pool.free(entry, false); } else { break; final int excess = Math.max(0, pool.getAllocatedCount() + 1 - maxPerRoute); if (excess > 0) { for (int i = 0; i < excess; i++) { final PoolEntry<T, C> lastUsed = pool.getLastUsed(); if (lastUsed == null) { break; pool.remove(lastUsed); if (pool.getAllocatedCount() < maxPerRoute) { final int freeCapacity = Math.max(this.maxTotal - this.leased.size(), 0); if (freeCapacity == 0) { lastUsed.discardConnection(CloseMode.GRACEFUL); final PerRoutePool<T, C> otherpool = getPool(lastUsed.getRoute()); otherpool.remove(lastUsed);
PoolEntry<T, C> entry; for (;;) { entry = pool.getFree(state); if (entry == null) { break; entry.discardConnection(CloseMode.GRACEFUL); this.available.remove(entry); pool.free(entry, false); } else { break; final int excess = Math.max(0, pool.getAllocatedCount() + 1 - maxPerRoute); if (excess > 0) { for (int i = 0; i < excess; i++) { final PoolEntry<T, C> lastUsed = pool.getLastUsed(); if (lastUsed == null) { break; pool.remove(lastUsed); if (pool.getAllocatedCount() < maxPerRoute) { final int freeCapacity = Math.max(this.maxTotal - this.leased.size(), 0); if (freeCapacity == 0) { lastUsed.discardConnection(CloseMode.GRACEFUL); final PerRoutePool<T, C> otherpool = getPool(lastUsed.getRoute()); otherpool.remove(lastUsed);
pool.free(entry, keepAlive); if (keepAlive) { switch (policy) {
pool.free(entry, keepAlive); if (keepAlive) { switch (policy) {
/** * Enumerates all available connections. * * @since 4.3 */ public void enumAvailable(final Callback<PoolEntry<T, C>> callback) { this.lock.lock(); try { final Iterator<PoolEntry<T, C>> it = this.available.iterator(); while (it.hasNext()) { final PoolEntry<T, C> entry = it.next(); callback.execute(entry); if (!entry.hasConnection()) { final PerRoutePool<T, C> pool = getPool(entry.getRoute()); pool.remove(entry); it.remove(); } } processPendingRequests(); purgePoolMap(); } finally { this.lock.unlock(); } }
/** * Enumerates all available connections. * * @since 4.3 */ public void enumAvailable(final Callback<PoolEntry<T, C>> callback) { this.lock.lock(); try { final Iterator<PoolEntry<T, C>> it = this.available.iterator(); while (it.hasNext()) { final PoolEntry<T, C> entry = it.next(); callback.execute(entry); if (!entry.hasConnection()) { final PerRoutePool<T, C> pool = getPool(entry.getRoute()); pool.remove(entry); it.remove(); } } processPendingRequests(); purgePoolMap(); } finally { this.lock.unlock(); } }
@Override public PoolStats getStats(final T route) { Args.notNull(route, "Route"); this.lock.lock(); try { final PerRoutePool<T, C> pool = getPool(route); int pendingCount = 0; for (final LeaseRequest<T, C> request: leasingRequests) { if (LangUtils.equals(route, request.getRoute())) { pendingCount++; } } return new PoolStats( pool.getLeasedCount(), pendingCount, pool.getAvailableCount(), getMax(route)); } finally { this.lock.unlock(); } }
@Override public PoolStats getStats(final T route) { Args.notNull(route, "Route"); this.lock.lock(); try { final PerRoutePool<T, C> pool = getPool(route); int pendingCount = 0; for (final LeaseRequest<T, C> request: leasingRequests) { if (LangUtils.equals(route, request.getRoute())) { pendingCount++; } } return new PoolStats( pool.getLeasedCount(), pendingCount, pool.getAvailableCount(), getMax(route)); } finally { this.lock.unlock(); } }
@Override public void close(final CloseMode closeMode) { if (this.isShutDown.compareAndSet(false, true)) { fireCallbacks(); this.lock.lock(); try { for (final PerRoutePool<T, C> pool: this.routeToPool.values()) { pool.shutdown(closeMode); } this.routeToPool.clear(); this.leased.clear(); this.available.clear(); this.leasingRequests.clear(); } finally { this.lock.unlock(); } } }
private PerRoutePool<T, C> getPool(final T route) { PerRoutePool<T, C> pool = this.routeToPool.get(route); if (pool == null) { pool = new PerRoutePool<>(route); this.routeToPool.put(route, pool); } return pool; }
private void purgePoolMap() { final Iterator<Map.Entry<T, PerRoutePool<T, C>>> it = this.routeToPool.entrySet().iterator(); while (it.hasNext()) { final Map.Entry<T, PerRoutePool<T, C>> entry = it.next(); final PerRoutePool<T, C> pool = entry.getValue(); if (pool.getAllocatedCount() == 0) { it.remove(); } } }