package me.hao0.antares.client.core; import me.hao0.antares.common.support.Lifecycle; import me.hao0.antares.common.support.Component; import me.hao0.antares.common.util.ZkPaths; import me.hao0.antares.common.zk.ChildListener; import me.hao0.antares.common.zk.ZkClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; /** * Author: haolin * Email: haolin.h0@gmail.com */ class AntaresZkAgent extends Component implements Lifecycle { private static final Logger log = LoggerFactory.getLogger(AntaresZkAgent.class); private AbstractAntaresClient client; /** * The zk client */ private ZkClient zk; private ClientRegister clientRegister; AntaresZkAgent(AbstractAntaresClient client, String zkServers, String namespace){ this.client = client; this.zk = ZkClient.newClient(zkServers, namespace); } public ZkClient client(){ return this.zk; } @Override public void doStart(){ // mk app clients path zk.mkdirs(ZkPaths.pathOfAppClients(client.getAppName())); // register client self clientRegister = new ClientRegister(client); clientRegister.start(); // get servers once getServersOnce(); // listen servers listenOnServerChanged(); } private void getServersOnce() { List<String> servers = zk.gets(ZkPaths.SERVERS); if (servers.isEmpty()){ log.warn("there are no available servers, please check the environment."); return; } for (String server: servers){ client.addHttpServer(server); } } private void listenOnServerChanged() { zk.newChildWatcher(ZkPaths.SERVERS, new ChildListener() { @Override protected void onAdd(String path, byte[] data) { String server = ZkPaths.lastNode(path); client.addHttpServer(server); log.info("The server({}) joined.", server); } @Override protected void onDelete(String path) { String server = ZkPaths.lastNode(path); client.removeHttpServer(server); log.info("The server({}) left.", server); } }); } @Override public void doShutdown(){ if (zk != null){ zk.shutdown(); } clientRegister.shutdown(); } }