package com.github.ltsopensource.admin.support; import com.github.ltsopensource.admin.access.BackendAccessFactory; import com.github.ltsopensource.admin.access.memory.NodeMemCacheAccess; import com.github.ltsopensource.admin.cluster.BackendAppContext; import com.github.ltsopensource.admin.cluster.BackendNode; import com.github.ltsopensource.admin.cluster.BackendRegistrySrv; import com.github.ltsopensource.admin.web.support.NoRelyJobGenerator; import com.github.ltsopensource.biz.logger.SmartJobLogger; import com.github.ltsopensource.core.cluster.Config; import com.github.ltsopensource.core.cluster.Node; import com.github.ltsopensource.core.commons.utils.BeanUtils; import com.github.ltsopensource.core.commons.utils.NetUtils; import com.github.ltsopensource.core.commons.utils.StringUtils; import com.github.ltsopensource.core.constant.Constants; import com.github.ltsopensource.core.registry.RegistryStatMonitor; import com.github.ltsopensource.core.spi.ServiceLoader; import com.github.ltsopensource.core.support.SystemClock; import com.github.ltsopensource.ec.EventCenter; import com.github.ltsopensource.queue.JobQueueFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import java.util.Map; /** * @author Robert HG (254963746@qq.com) on 6/6/15. */ public class BackendAppContextFactoryBean implements FactoryBean<BackendAppContext>, InitializingBean { private BackendAppContext appContext; @Override public BackendAppContext getObject() throws Exception { return appContext; } @Override public Class<?> getObjectType() { return BackendAppContext.class; } @Override public boolean isSingleton() { return true; } @Override public void afterPropertiesSet() throws Exception { final Node node = new BackendNode(); node.setCreateTime(SystemClock.now()); node.setIp(NetUtils.getLocalHost()); node.setHostName(NetUtils.getLocalHostName()); node.setIdentity(Constants.ADMIN_ID_PREFIX + StringUtils.generateUUID()); Config config = new Config(); config.setIdentity(node.getIdentity()); config.setNodeType(node.getNodeType()); config.setRegistryAddress(AppConfigurer.getProperty("registryAddress")); String clusterName = AppConfigurer.getProperty("clusterName"); if (StringUtils.isEmpty(clusterName)) { throw new IllegalArgumentException("clusterName in lts-admin.cfg can not be null."); } config.setClusterName(clusterName); for (Map.Entry<String, String> entry : AppConfigurer.allConfig().entrySet()) { // 将 config. 开头的配置都加入到config中 if (entry.getKey().startsWith("configs.")) { config.setParameter(entry.getKey().replaceFirst("configs.", ""), entry.getValue()); } } appContext = new BackendAppContext(); appContext.setConfig(config); appContext.setNode(node); appContext.setEventCenter(ServiceLoader.load(EventCenter.class, config)); appContext.setRegistryStatMonitor(new RegistryStatMonitor(appContext)); appContext.setBackendRegistrySrv(new BackendRegistrySrv(appContext)); initAccess(config); // ----------------------下面是JobQueue的配置--------------------------- Config jobTConfig = (Config) BeanUtils.deepClone(config); for (Map.Entry<String, String> entry : AppConfigurer.allConfig().entrySet()) { // 将 jobT. 开头的配置都加入到jobTConfig中 if (entry.getKey().startsWith("jobT.")) { String key = entry.getKey().replace("jobT.", ""); String value = entry.getValue(); jobTConfig.setParameter(key, value); } } initJobQueue(jobTConfig); appContext.getBackendRegistrySrv().start(); } private void initJobQueue(Config config) { JobQueueFactory factory = ServiceLoader.load(JobQueueFactory.class, config); appContext.setExecutableJobQueue(factory.getExecutableJobQueue(config)); appContext.setExecutingJobQueue(factory.getExecutingJobQueue(config)); appContext.setCronJobQueue(factory.getCronJobQueue(config)); appContext.setRepeatJobQueue(factory.getRepeatJobQueue(config)); appContext.setSuspendJobQueue(factory.getSuspendJobQueue(config)); appContext.setJobFeedbackQueue(factory.getJobFeedbackQueue(config)); appContext.setNodeGroupStore(factory.getNodeGroupStore(config)); appContext.setJobLogger(new SmartJobLogger(appContext)); appContext.setNoRelyJobGenerator(new NoRelyJobGenerator(appContext)); } private void initAccess(Config config) { BackendAccessFactory factory = ServiceLoader.load(BackendAccessFactory.class, config); appContext.setBackendJobClientMAccess(factory.getBackendJobClientMAccess(config)); appContext.setBackendJobTrackerMAccess(factory.getJobTrackerMAccess(config)); appContext.setBackendTaskTrackerMAccess(factory.getBackendTaskTrackerMAccess(config)); appContext.setBackendJVMGCAccess(factory.getBackendJVMGCAccess(config)); appContext.setBackendJVMMemoryAccess(factory.getBackendJVMMemoryAccess(config)); appContext.setBackendJVMThreadAccess(factory.getBackendJVMThreadAccess(config)); appContext.setBackendNodeOnOfflineLogAccess(factory.getBackendNodeOnOfflineLogAccess(config)); appContext.setNodeMemCacheAccess(new NodeMemCacheAccess()); } }