protected void retry() { logger.info("Retrying ..."); reestablish().single().subscribe(new Subscriber<C>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { scheduleRetry(); } @Override public void onNext(C newDelegateChannel) { // first switch to the new delegate, then close the old delegate C oldDelegateChannel = currentChannelRef.getAndSet(newDelegateChannel); subscribeToDelegateChannelLifecycle(newDelegateChannel); if (oldDelegateChannel != null) { oldDelegateChannel.close(); } } }); }