package netflix.ocelli.rxnetty.internal; import io.reactivex.netty.client.ConnectionProvider; import io.reactivex.netty.protocol.tcp.client.events.TcpClientEventListener; import netflix.ocelli.Instance; import netflix.ocelli.rxnetty.FailureListener; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; import rx.Subscription; import rx.functions.Action1; import rx.functions.Func1; import java.util.Collections; import java.util.List; class HostHolder<W, R> { private final Observable<List<HostConnectionProvider<W, R>>> providerStream; private volatile List<HostConnectionProvider<W, R>> providers; private Subscription streamSubscription; HostHolder(Observable<Instance<ConnectionProvider<W, R>>> providerStream, final Func1<FailureListener, ? extends TcpClientEventListener> eventListenerFactory) { this.providerStream = providerStream.lift(new HostCollector<W, R>(eventListenerFactory)) .serialize()/*Host collector emits concurrently*/; providers = Collections.emptyList(); subscribeToHostStream(); } List<HostConnectionProvider<W, R>> getProviders() { return providers; } private void subscribeToHostStream() { streamSubscription = providerStream.subscribe(new Action1<List<HostConnectionProvider<W, R>>>() { @Override public void call(List<HostConnectionProvider<W, R>> hostConnectionProviders) { providers = hostConnectionProviders; } }); } public Observable<Void> shutdown() { return Observable.create(new OnSubscribe<Void>() { @Override public void call(Subscriber<? super Void> subscriber) { if (null != streamSubscription) { streamSubscription.unsubscribe(); } subscriber.onCompleted(); } }); } }