package com.hubspot.baragon.watcher;
import com.google.common.base.Supplier;
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.multibindings.Multibinder;
import com.hubspot.baragon.config.ZooKeeperConfiguration;
import com.hubspot.ringleader.watcher.PersistentWatcher;
import com.hubspot.ringleader.watcher.WatcherFactory;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class BaragonWatcherModule extends AbstractModule {
@Override
protected void configure() {
bind(BaragonStateWatcher.class).asEagerSingleton();
Multibinder.newSetBinder(binder(), BaragonStateListener.class);
}
@Baragon
@Provides
public CuratorFramework provideCurator(ZooKeeperConfiguration config) {
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(config.getQuorum())
.sessionTimeoutMs(config.getSessionTimeoutMillis())
.connectionTimeoutMs(config.getConnectTimeoutMillis())
.retryPolicy(new ExponentialBackoffRetry(config.getRetryBaseSleepTimeMilliseconds(), config.getRetryMaxTries()))
.namespace(config.getZkNamespace())
.build();
client.start();
return client;
}
@Baragon
@Provides
@Singleton
public PersistentWatcher provideWatcher(@Baragon final Provider<CuratorFramework> curatorProvider) {
return new WatcherFactory(new Supplier<CuratorFramework>() {
@Override
public CuratorFramework get() {
return curatorProvider.get();
}
}).dataWatcher("/state-last-updated");
}
}