public static <T> BreakerSwitchSubject<T> create(final Subject<T, T> delegate) { final BreakerSwitchOperator<T> breaker = new BreakerSwitchOperator<>(); return new BreakerSwitchSubject<>(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { delegate.lift(breaker).subscribe(new SafeSubscriber<>(subscriber)); } }, delegate, breaker); } }
@Override public void onCompleted() { BreakerSwitchSubscriber.this.unsubscribe(); BreakerSwitchSubscriber.this.onCompleted(); }
@Override public void onNext(ChangeNotification<T> notification) { notificationsSubject.onNext(notification); }
@Override public ResourceUpdate<Server> reload(Set<Server> currentSnapshot) { try { Set<Server> newAddresses = resolveEurekaServerDN(); succeededOnce = true; return new ResourceUpdate<>(newAddresses, cancellationSet(currentSnapshot, newAddresses)); } catch (NamingException e) { if (succeededOnce) { throw new ResourceLoaderException("DNS failure on subsequent access", true, e); } else { throw new ResourceLoaderException("Cannot resolve DNS entry on startup", false, e); } } }
public void close() { breaker.close(); }
@Override protected Observable<ChangeNotification<Server>> serverUpdates() { return ResourceObservable.fromResource(new FileResolveTask(), reloadInterval, idleTimeout, timeUnit, scheduler); }
@Override public void onCompleted() { notificationsSubject.onCompleted(); }
public static <T> Observable<T> fromResource(ResourceLoader<T> loader, long refreshInterval, long idleTimeout, TimeUnit timeUnit, Scheduler scheduler) { return new ResourceObservable<T>(loader, scheduler, refreshInterval, idleTimeout, timeUnit).getObservable(); }
@Override public void onCompleted() { subscriber.onCompleted(); }
@Override public void onNext(T next) { subscriber.onNext(next); }
@Override public void onError(Throwable e) { subscriber.onError(e); }
@Override public Subscriber<? super T> call(final Subscriber<? super T> subscriber) { return new BreakerSwitchSubscriber<>(subscriber, onCompleteFuture); }
@Override public void onError(Throwable e) { notificationsSubject.onError(e); }
@Override public boolean hasObservers() { return notificationsSubject.hasObservers(); }
public static <T> PauseableSubject<T> create() { final Subject<T, T> notificationSubject = PublishSubject.create(); return new PauseableSubject<T>(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { notificationSubject.subscribe(subscriber); } }, notificationSubject); }
@Override public ResourceUpdate<ChangeNotification<String>> reload(Set<ChangeNotification<String>> currentSnapshot) { try { Set<ChangeNotification<String>> newAddresses = DnsResolver.resolveServerDN(domainName); succeededOnce = true; return new ResourceUpdate<>(newAddresses, cancellationSet(currentSnapshot, newAddresses), sentinel); } catch (NamingException e) { if (succeededOnce) { throw new ResourceLoaderException("DNS failure on subsequent access", true, e); } else { throw new ResourceLoaderException("Cannot resolve DNS entry on startup", false, e); } } }
public void unregister() { for (BreakerSwitchOperator subject : subscriptionBreakers.values()) { subject.close(); } subscriptionBreakers.clear(); }
private static Observable<ChangeNotification<Server>> createServerSource(File textFile, Configuration configuration) { return ResourceObservable.fromResource( new FileResolveTask(textFile, configuration), configuration.reloadInterval, configuration.idleTimeout, configuration.timeUnit, configuration.scheduler ); }
@Override public void shutdown() { updatesSubject.onCompleted(); notificationSources.onCompleted(); }