package org.ovirt.engine.core.vdsbroker; import java.util.Map; import org.ovirt.vdsm.jsonrpc.client.events.EventSubscriber; import org.reactivestreams.Subscription; public class HostConnectionRefresher { private SubscriberRefreshingHostOnHostConnectionChangeEvent subscriber; private ResourceManager resourceManager; protected VdsManager vdsManager; public HostConnectionRefresher(VdsManager vdsManager, ResourceManager resourceManager) { this.vdsManager = vdsManager; this.resourceManager = resourceManager; } public void start() { subscriber = new SubscriberRefreshingHostOnHostConnectionChangeEvent(); resourceManager.subscribe(subscriber); } public void stop() { if (subscriber != null) { subscriber.unsubscribe(); } } private class SubscriberRefreshingHostOnHostConnectionChangeEvent extends EventSubscriber { private Subscription subscription; public SubscriberRefreshingHostOnHostConnectionChangeEvent() { super(HostConnectionRefresher.this.vdsManager.getVdsHostname() + "|net|host_conn|no_id"); } @Override public void onSubscribe(Subscription sub) { subscription = sub; subscription.request(1); } @Override public void onNext(Map<String, Object> map) { try { resourceManager.getEventListener().refreshHostCapabilities(vdsManager.getVdsId()); } finally { subscription.request(1); } } @Override public void onError(Throwable t) { // communication issue is delivered as a message so we need to request for more subscription.request(1); } @Override public void onComplete() { } public void unsubscribe() { subscription.cancel(); } } }