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); }); } }
/** * 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 boolean isExhausted() { return pendingConnectionCount() >= connectionPoolSettings.maxPendingConnectionsPerHost(); }