@Override public void onCompleted() { logger.info("Channel closed gracefully and must be reconnected"); scheduleRetry(); }
protected RetryableServiceChannel(C initialDelegate, long retryInitialDelayMs, Scheduler scheduler) { super(STATES.Open, null); this.currentChannelRef = new AtomicReference<>(initialDelegate); this.delegateLifecycleSubscription = new AtomicReference<>(null); this.retryInitialDelayMs = retryInitialDelayMs; this.maxRetryDelayMs = retryInitialDelayMs * MAX_EXP_BACK_OFF_MULTIPLIER; this.worker = scheduler.createWorker(); this.retryDelay = retryInitialDelayMs; subscribeToDelegateChannelLifecycle(initialDelegate); }
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(); } } }); }
protected void scheduleRetry() { long closedAfter = worker.now() - lastConnectTime; if (closedAfter >= maxRetryDelayMs) { retryDelay = retryInitialDelayMs; } worker.schedule(retryAction, retryDelay, TimeUnit.MILLISECONDS); bumpUpRetryDelay(); }
@Override public void onError(Throwable e) { if (recoverableError(e)) { logger.info("Channel failure; scheduling the reconnection in " + retryDelay + "ms", e); scheduleRetry(); } else { logger.error("Unrecoverable error; closing the retryable channel"); lifecycle.onError(e); close(); } }