@Override public Observable<Connection> borrowConnection() { if (busyConnections.incrementAndGet() <= connectionPoolSettings.maxConnectionsPerHost()) { return doBorrowConnection(); } busyConnections.decrementAndGet(); TimeoutObservableFactory timeoutObservableFactory = new TimeoutObservableFactory(origin, waitingSubscribers); return timeoutObservableFactory.create(stats, connectionPoolSettings); }
public Observable<Connection> create(ConnectionPool.Stats stats, Settings connectionPoolSettings) { Observable.OnSubscribe<Connection> onSubscribe = subscriber -> { waitingSubscriber = subscriber; if (stats.pendingConnectionCount() >= connectionPoolSettings.maxPendingConnectionsPerHost()) { subscriber.onError(new MaxPendingConnectionsExceededException( origin, stats.pendingConnectionCount(), connectionPoolSettings.maxPendingConnectionsPerHost())); } else { waitingSubscribers.add(subscriber); } }; return Observable.create(onSubscribe) .timeout(connectionPoolSettings.pendingConnectionTimeoutMillis(), MILLISECONDS) .onErrorResumeNext(throwable -> { if (throwable instanceof TimeoutException) { waitingSubscribers.remove(waitingSubscriber); return Observable.error(new MaxPendingConnectionTimeoutException(origin, connectionPoolSettings.pendingConnectionTimeoutMillis())); } return Observable.error(throwable); }); } }
@Override public boolean isExhausted() { return pendingConnectionCount() >= connectionPoolSettings.maxPendingConnectionsPerHost(); }
/** * Constructs an instance with inherited settings. * * @param settings settings to inherit from */ public Builder(ConnectionPool.Settings settings) { this.maxConnectionsPerHost = settings.maxConnectionsPerHost(); this.maxPendingConnectionsPerHost = settings.maxPendingConnectionsPerHost(); this.connectTimeoutMillis = settings.connectTimeoutMillis(); this.socketTimeoutMillis = settings.socketTimeoutMillis(); this.pendingConnectionTimeoutMillis = settings.pendingConnectionTimeoutMillis(); this.connectionExpirationSeconds = settings.connectionExpirationSeconds(); }
@Override public String toString() { return toStringHelper(this) .add("pendingConnections", pendingConnectionCount()) .add("busyConnections", busyConnections) .add("maxConnections", connectionPoolSettings.maxConnectionsPerHost()) .toString(); } }