com.vip.saturn.job.console.service.impl.ServerDimensionServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.vip.saturn.job.console.service.impl.ServerDimensionServiceImpl.java

Source

/**
 * Copyright 2016 vip.com.
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * </p>
 */

package com.vip.saturn.job.console.service.impl;

import java.text.DateFormat;
import java.util.*;

import javax.annotation.Resource;

import com.vip.saturn.job.console.exception.SaturnJobConsoleException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.google.common.base.Strings;
import com.vip.saturn.job.console.domain.JobStatus;
import com.vip.saturn.job.console.domain.ServerBriefInfo;
import com.vip.saturn.job.console.domain.ServerStatus;
import com.vip.saturn.job.console.repository.zookeeper.CuratorRepository;
import com.vip.saturn.job.console.service.JobDimensionService;
import com.vip.saturn.job.console.service.ServerDimensionService;
import com.vip.saturn.job.console.utils.ExecutorNodePath;
import com.vip.saturn.job.console.utils.JobNodePath;

@Service
public class ServerDimensionServiceImpl implements ServerDimensionService {

    protected static Logger AUDITLOGGER = LoggerFactory.getLogger("AUDITLOG");
    private static final Logger logger = LoggerFactory.getLogger(ServerDimensionServiceImpl.class);

    private DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM,
            Locale.SIMPLIFIED_CHINESE);
    @Resource
    private CuratorRepository curatorRepository;
    @Resource
    private JobDimensionService jobDimensionService;

    @Override
    public Map<String, Object> getAllServersBriefInfo() {
        CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = curatorRepository.inSessionClient();
        HashMap<String, Object> model = new HashMap<String, Object>();
        Map<String, ServerBriefInfo> sbfMap = new LinkedHashMap<String, ServerBriefInfo>();
        List<String> jobs = new ArrayList<>();
        try {
            jobs = jobDimensionService.getAllUnSystemJobs(curatorFrameworkOp);
        } catch (SaturnJobConsoleException e) {
            logger.error(e.getMessage(), e);
        }

        Map<String, Map<String, Integer>> jobNameExecutorNameTotalLevel = new HashMap<>();
        String executorNodePath = ExecutorNodePath.getExecutorNodePath();
        if (curatorFrameworkOp.checkExists(executorNodePath)) {
            List<String> executors = curatorFrameworkOp.getChildren(executorNodePath);
            if (!CollectionUtils.isEmpty(executors)) {
                for (String executor : executors) {
                    ServerBriefInfo sbf = new ServerBriefInfo(executor);
                    String ip = curatorFrameworkOp.getData(ExecutorNodePath.getExecutorNodePath(executor, "ip"));
                    sbf.setServerIp(ip);
                    String lastBeginTime = curatorFrameworkOp
                            .getData(ExecutorNodePath.getExecutorNodePath(sbf.getExecutorName(), "lastBeginTime"));
                    sbf.setLastBeginTime(null == lastBeginTime ? null
                            : dateFormat.format(new Date(Long.parseLong(lastBeginTime))));
                    if (!Strings.isNullOrEmpty(ip)) {
                        sbf.setStatus(ServerStatus.ONLINE);
                    } else {
                        sbf.setStatus(ServerStatus.OFFLINE);
                    }
                    sbf.setVersion(
                            curatorFrameworkOp.getData(ExecutorNodePath.getExecutorNodePath(executor, "version")));
                    if (!CollectionUtils.isEmpty(jobs)) {
                        for (String jobName : jobs) {
                            String serverNodePath = JobNodePath.getServerNodePath(jobName);
                            if (!curatorFrameworkOp.checkExists(serverNodePath)) {
                                continue;
                            }
                            if (Strings.isNullOrEmpty(sbf.getServerIp())) {
                                String serverIp = curatorFrameworkOp
                                        .getData(JobNodePath.getServerNodePath(jobName, executor, "ip"));
                                sbf.setServerIp(serverIp);
                            }
                            Map<String, Integer> executorNameWithTotalLevel = null;
                            if (jobNameExecutorNameTotalLevel.containsKey(jobName)) {
                                executorNameWithTotalLevel = jobNameExecutorNameTotalLevel.get(jobName);
                            } else {
                                executorNameWithTotalLevel = new LinkedHashMap<>();
                                jobNameExecutorNameTotalLevel.put(jobName, executorNameWithTotalLevel);
                            }
                            if (ServerStatus.ONLINE.equals(sbf.getStatus())) {// ??onlineExecutor
                                executorNameWithTotalLevel.put(executor, 0);
                            }
                            String sharding = curatorFrameworkOp
                                    .getData(JobNodePath.getServerNodePath(jobName, executor, "sharding"));
                            if (!Strings.isNullOrEmpty(sharding)) {
                                sbf.setHasSharding(true);// ????
                                if (JobStatus.STOPPED.equals(jobDimensionService.getJobStatus(jobName))) {
                                    continue;// ?STOPPED??
                                }
                                if (ServerStatus.OFFLINE.equals(sbf.getStatus())) {// offlineexecutor??
                                    continue;
                                }
                                // concat executorSharding
                                String executorSharding = jobName + ":" + sharding;
                                if (Strings.isNullOrEmpty(sbf.getSharding())) {// ????
                                    sbf.setSharding(executorSharding);
                                } else {
                                    sbf.setSharding(sbf.getSharding() + "<br/>" + executorSharding);
                                }
                                // calculate totalLoadLevel
                                String loadLevelNode = curatorFrameworkOp
                                        .getData(JobNodePath.getConfigNodePath(jobName, "loadLevel"));
                                Integer loadLevel = 1;
                                if (!Strings.isNullOrEmpty(loadLevelNode)) {
                                    loadLevel = Integer.parseInt(loadLevelNode);
                                }
                                Integer totalLoadLevel = sbf.getTotalLoadLevel();
                                int thisJobsLoad = (sharding.split(",").length * loadLevel);
                                sbf.setTotalLoadLevel(
                                        (sbf.getTotalLoadLevel() == null ? 0 : totalLoadLevel) + thisJobsLoad);
                                executorNameWithTotalLevel.put(executor, thisJobsLoad);
                            }
                        }
                    }
                    sbfMap.put(executor, sbf);
                }
            }
            model.put("serverInfos", sbfMap.values());
            model.put("jobShardLoadLevels", jobNameExecutorNameTotalLevel);
        }
        return model;
    }

    @Override
    public ServerStatus getExecutorStatus(String executor) {
        CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = curatorRepository.inSessionClient();
        if (curatorFrameworkOp.checkExists(ExecutorNodePath.getExecutorNodePath(executor, "ip"))) {
            return ServerStatus.ONLINE;
        }
        return ServerStatus.OFFLINE;
    }

    @Override
    public void removeOffLineExecutor(String executor) {
        CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = curatorRepository.inSessionClient();
        curatorFrameworkOp.deleteRecursive(ExecutorNodePath.getExecutorNodePath(executor));
        List<String> jobNames = new ArrayList<>();
        try {
            jobNames = jobDimensionService.getAllJobs(curatorFrameworkOp);
        } catch (SaturnJobConsoleException e) {
            logger.error(e.getMessage(), e);
        }
        if (CollectionUtils.isEmpty(jobNames)) {
            return;
        }
        for (String jobName : jobNames) {
            String executorNode = JobNodePath.getServerNodePath(jobName, executor);
            if (!curatorFrameworkOp.checkExists(executorNode)) {
                continue;
            }
            curatorFrameworkOp.deleteRecursive(executorNode);
        }
    }

    @Override
    public boolean isRunning(String jobName, String executor) {
        CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = curatorRepository.inSessionClient();
        String status = curatorFrameworkOp.getData(JobNodePath.getServerStatus(jobName, executor));
        if ("RUNNING".equals(status)) {
            return true;
        }
        return false;
    }

    @Override
    public boolean isReady(String jobName, String executor) {
        CuratorRepository.CuratorFrameworkOp curatorFrameworkOp = curatorRepository.inSessionClient();
        String status = curatorFrameworkOp.getData(JobNodePath.getServerStatus(jobName, executor));
        if ("READY".equals(status)) {
            return true;
        }
        return false;
    }

}