package me.hao0.antares.client.core; import com.google.common.base.Strings; import me.hao0.antares.client.job.*; import me.hao0.antares.client.job.execute.JobExecutor; import me.hao0.antares.client.job.execute.SimpleJobExecutor; import me.hao0.antares.common.support.Component; import me.hao0.antares.common.util.Systems; import me.hao0.antares.common.util.ZkPaths; import me.hao0.antares.common.zk.ZkClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * Author: haolin * Email: haolin.h0@gmail.com */ abstract class AbstractAntaresClient extends Component implements AntaresClient { private static final Logger log = LoggerFactory.getLogger(AbstractAntaresClient.class); /** * The client version */ private final String CLIENT_VERSION = "1.0.0"; /** * The app name */ private final String appName; /** * The app secret */ private final String appSecret; /** * The zk servers */ private final String zkServers; /** * The thread count for executing task */ private Integer executorThreadCount = 32; /** * The http servers */ private final List<String> httpServers = new CopyOnWriteArrayList<>(); /** * The zk namespace */ private final String zkNamespace; /** * The http agent */ private final AntaresHttpAgent http = new AntaresHttpAgent(this); /** * The zk client */ private final AntaresZkAgent zk; /** * The job manager */ private final JobManager jobManager = new JobManager(this); /** * The job executor */ private JobExecutor jobExecutor = new SimpleJobExecutor(this); public AbstractAntaresClient(String appName, String zkServers) { this(appName, null, zkServers); } public AbstractAntaresClient(String appName, String appSecret, String zkServers) { this(appName, appSecret, zkServers, null); } public AbstractAntaresClient(String appName, String appSecret, String zkServers, String zkNamespace) { this.appName = appName; this.appSecret = appSecret; this.zkServers = zkServers; this.zkNamespace = Strings.isNullOrEmpty(zkNamespace) ? ZkPaths.DEFAULT_NS : zkNamespace; zk = new AntaresZkAgent(this, zkServers, this.zkNamespace); } @Override public String getClientVersion() { return CLIENT_VERSION; } @Override public void setJobExecutor(JobExecutor jobExecutor) { this.jobExecutor = jobExecutor; } public String getAppName() { return appName; } public String getAppSecret() { return appSecret; } public String getZkNamespace() { return zkNamespace; } public String getZkServers() { return zkServers; } public Integer getExecutorThreadCount() { return executorThreadCount; } public void setExecutorThreadCount(Integer executorThreadCount) { this.executorThreadCount = executorThreadCount; } public ZkClient getZk() { return zk.client(); } public JobManager getJobManager() { return jobManager; } public JobExecutor getJobExecutor() { return jobExecutor; } public AntaresHttpAgent getHttp() { return http; } public List<String> getHttpServers() { return httpServers; } public void addHttpServer(String httpServer) { if (!this.httpServers.contains(httpServer)){ this.httpServers.add(httpServer); } } public void removeHttpServer(String httpServer){ this.httpServers.remove(httpServer); } @Override public void doStart(){ zk.start(); http.start(); jobExecutor.start(); jobManager.start(); afterStart(); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { shutdown(); } }); log.info("Antares client started successfully."); } /** * Shutdown the client */ @Override public void doShutdown(){ zk.shutdown(); http.shutdown(); jobManager.shutdown(); jobExecutor.shutdown(); afterShutdown(); log.info("Antares client shutdown finished."); } @Override public void registerJob(Job job){ jobManager.registerJob(job); } /** * Subclass call */ protected abstract void afterStart(); /** * Subclass call */ protected abstract void afterShutdown(); }