@Override public final <T> IORunnable runnable(EventReader<T> eventReader, Listener<T> listener) { final StreamParameters streamParameters = this.streamParameters != null ? this.streamParameters : new StreamParameters(); final String queryString = streamParameters.toQueryString(); final URI uri = getURI(queryString); final Set<String> eventNames = getEventNames(); final Optional<Subscription> subscription = getSubscription(); final Optional<Lock> lock = getLock(); final BackoffStrategy backoffStrategy = this.backoffStrategy != null ? this.backoffStrategy : new EqualJitterBackoffStrategy(); final MetricsCollector metricsCollector = this.metricsCollector != null ? this.metricsCollector : NoMetricsCollector.NO_METRICS_COLLECTOR; final BatchHandler batchHandler = this.batchHandler != null ? this.batchHandler : DefaultBatchHandler.INSTANCE; return new NakadiReader<>(uri, requestFactory, backoffStrategy, cursorManager, eventNames, subscription, lock, eventReader, listener, batchHandler, metricsCollector); }