package org.cad.interruptus.core; import java.io.IOException; import java.util.Collections; import java.util.List; import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.leader.LeaderLatchListener; import org.apache.curator.retry.ExponentialBackoffRetry; import org.cad.interruptus.core.zookeeper.ZookeeperLifecycleListener; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; public class ZookeeperFactoryBean implements FactoryBean<CuratorFramework>, InitializingBean, DisposableBean { RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); LeaderLatchListener latchListener; CuratorFramework curator; String connection; private int connectionTimeout = 2000; private int sessionTimeout = 10000; private List<ZookeeperLifecycleListener> lifecycleListeners = Collections.EMPTY_LIST; public void setRetryPolicy(RetryPolicy retryPolicy) { this.retryPolicy = retryPolicy; } public void setConnection(String connectionString) { this.connection = connectionString; } public void setConnectionTimeout(int connectionTimeout) { this.connectionTimeout = connectionTimeout; } public void setSessionTimeout(int sessionTimeout) { this.sessionTimeout = sessionTimeout; } public void setLifecycleListeners(List<ZookeeperLifecycleListener> lifecycleListeners) { this.lifecycleListeners = lifecycleListeners; } @Override public CuratorFramework getObject() throws InterruptedException, Exception { if (curator == null) { curator = createClient(); curator.start(); curator.getZookeeperClient().blockUntilConnectedOrTimedOut(); for (ZookeeperLifecycleListener listener : lifecycleListeners) { listener.onStart(curator); } } return curator; } @Override public Class<?> getObjectType() { return CuratorFramework.class; } @Override public boolean isSingleton() { return true; } @Override public void destroy() throws IOException, Exception { if (curator == null) { return; } for (ZookeeperLifecycleListener listener : lifecycleListeners) { listener.onStop(curator); } curator.close(); } @Override public void afterPropertiesSet() { } protected CuratorFramework createClient() { return CuratorFrameworkFactory.builder() .connectionTimeoutMs(connectionTimeout) .sessionTimeoutMs(sessionTimeout) .connectString(connection) .retryPolicy(retryPolicy) .build(); } }