@Override public void call() { // unregister retryableConnection.getChannelObservable().flatMap(new Func1<RegistrationChannel, Observable<Void>>() { @Override public Observable<Void> call(RegistrationChannel channel) { return channel.unregister().finallyDo(new Action0() { // best effort unregister @Override public void call() { retryableConnection.close(); } }); } }).subscribe(new NoOpSubscriber<Void>()); } })
/** * @return a channel observable that does clean up of the previous channel every time a new channel is created */ protected Observable<CHANNEL> channelObservableWithCleanUp(Subject<CHANNEL, CHANNEL> channelSubject) { final Observable<CHANNEL> channelObservable = channelSubject.asObservable() .scan(new Func2<CHANNEL, CHANNEL, CHANNEL>() { @Override public CHANNEL call(CHANNEL prev, CHANNEL curr) { if (prev != null) { logger.info("Closing old channel {}", prev); prev.close(); } return curr; } }); channelObservable.subscribe(new NoOpSubscriber<CHANNEL>()); // eagerly start the cleanup scan return channelObservable; } }
@PostConstruct public void start() { shutdownListener = new ShutdownListener(port, new Action0() { @Override public void call() { logger.info("Eureka server shutdown requested."); logger.info("Unregistering itself from the registry..."); selfRegistrationService.shutdown(); logger.info("Shutting down service container..."); lifecycleManager.close(); } }); shutdownListener.start(); selfRegistrationService.resolve() .take(1) .doOnNext(new Action1<InstanceInfo>() { @Override public void call(InstanceInfo instanceInfo) { logger.info("Instance {} listening for shutdown on port {}", instanceInfo.getId(), getShutdownPort()); } }).subscribe(new NoOpSubscriber<>()); // logging only, so ignore errors by using a no-op subscriber }
final Subscriber<OP> opSubscriber = new NoOpSubscriber<>(); final Observable<CHANNEL> channelObservable = channelObservableWithCleanUp(channelSubject);