import org.apache.commons.lang.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
public class AgentLeaderSelector {
private final static Logger logger= LoggerFactory.getLogger(AgentLeaderSelector.class);
private static AgentLeaderSelector ourInstance = new AgentLeaderSelector();
public static AgentLeaderSelector getInstance() {
return ourInstance;
}
private AgentLeaderSelector() {
}
private volatile boolean leader = false;
private CuratorFramework client;
private LeaderSelector leaderSelector;
public boolean isLeader() {
return leader;
}
public void start() {
String zkAddress = AgentConfig.getRoot().element("agent").element("zkAddress").getTextTrim();
if (StringUtils.isBlank(zkAddress)) {
System.err.println("config agent/zkAddress must be set,now use single node modal");
leader = true;
return;
}
client = CuratorFrameworkFactory.newClient(zkAddress, new ExponentialBackoffRetry(1000, 10));
client.start();
leaderSelector = new LeaderSelector(client, "/omp/collector/leader", new LeaderSelectorListenerAdapter() {
@Override
public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
logger.info(AgentMain.AGENT_NAME + " now is the Master Node.");
System.err.println(AgentMain.AGENT_NAME + " now is the Master Node.");
try {
leader = true;
// 阻塞,直到程序退出
TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
logger.info(AgentMain.AGENT_NAME + " was interrupted.");
Thread.currentThread().interrupt();
} finally {
leader = false;
logger.info(AgentMain.AGENT_NAME + " exit Master.\n");
}
}
});
leaderSelector.autoRequeue();
leaderSelector.start();
}
public void stop() {
if (leaderSelector != null) {
leaderSelector.close();
}
if (client != null) {
client.close();
}
}
}
zk选举实例
最新推荐文章于 2023-09-22 21:34:24 发布