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

Java tutorial

Introduction

Here is the source code for com.vip.saturn.job.console.service.impl.SaturnJunkDataServiceImpl.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.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.KeeperException.NoNodeException;
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.constants.SaturnConstants;
import com.vip.saturn.job.console.domain.RegistryCenterClient;
import com.vip.saturn.job.console.domain.RegistryCenterConfiguration;
import com.vip.saturn.job.console.domain.SaturnJunkData;
import com.vip.saturn.job.console.domain.SaturnJunkDataOpType;
import com.vip.saturn.job.console.exception.JobConsoleException;
import com.vip.saturn.job.console.service.SaturnJunkDataService;
import com.vip.saturn.job.console.utils.ExecutorNodePath;
import com.vip.saturn.job.console.utils.JobNodePath;
import com.vip.saturn.job.sharding.node.SaturnExecutorsNode;

/** 
 * @author yangjuanying  
 */
@Service
public class SaturnJunkDataServiceImpl implements SaturnJunkDataService {

    protected static Logger log = LoggerFactory.getLogger(SaturnJunkDataServiceImpl.class);

    @Override
    public Collection<SaturnJunkData> getJunkData(String zkAddr) {
        ArrayList<RegistryCenterConfiguration> registryCenterList = RegistryCenterServiceImpl.ZKADDR_TO_ZKCLUSTER_MAP
                .get(zkAddr).getRegCenterConfList();
        if (CollectionUtils.isEmpty(registryCenterList)) {
            return Collections.emptyList();
        }
        List<SaturnJunkData> saturnJunkDataList = new ArrayList<SaturnJunkData>();
        for (RegistryCenterConfiguration registryCenter : registryCenterList) {
            try {
                String namespace = registryCenter.getNameAndNamespace();
                RegistryCenterClient registryCenterClient = RegistryCenterServiceImpl
                        .getCuratorByNameAndNamespace(namespace);
                if (registryCenterClient == null) {
                    continue;
                }
                String zkBootstrapKey = registryCenter.getBootstrapKey();
                CuratorFramework curatorFramework = registryCenterClient.getCuratorClient();
                List<String> jobNames = curatorFramework.getChildren().forPath(JobNodePath.get$JobsNodePath());
                for (String jobName : jobNames) {
                    if (null != curatorFramework.checkExists().forPath(JobNodePath.getConfigNodePath(jobName))) {// $Jobs/jobName/config exists
                        String toDeletePath = JobNodePath.getConfigNodePath(jobName, "toDelete");
                        if (null != curatorFramework.checkExists().forPath(toDeletePath)) {// toDelete node is junk data
                            SaturnJunkData saturnJunkData = new SaturnJunkData();
                            saturnJunkData.setPath(toDeletePath);
                            saturnJunkData.setNamespace(namespace);
                            saturnJunkData.setType(SaturnJunkDataOpType.DELETE.toString());
                            saturnJunkData.setDescription("toDelete");
                            saturnJunkData.setZkAddr(zkBootstrapKey);
                            saturnJunkDataList.add(saturnJunkData);
                        }
                        String jobConfigForceShardNodePath = SaturnExecutorsNode
                                .getJobConfigForceShardNodePath(jobName);
                        if (null != curatorFramework.checkExists().forPath(jobConfigForceShardNodePath)) {// forceShard node is junk data
                            SaturnJunkData saturnJunkData = new SaturnJunkData();
                            saturnJunkData.setPath(jobConfigForceShardNodePath);
                            saturnJunkData.setNamespace(namespace);
                            saturnJunkData.setType(SaturnJunkDataOpType.DELETE.toString());
                            saturnJunkData.setDescription("forceShard");
                            saturnJunkData.setZkAddr(zkBootstrapKey);
                            saturnJunkDataList.add(saturnJunkData);
                        }
                        if (null == curatorFramework.checkExists()
                                .forPath(JobNodePath.getServerNodePath(jobName))) {
                            continue;
                        }
                        List<String> jobExecutors = curatorFramework.getChildren()
                                .forPath(JobNodePath.getServerNodePath(jobName));
                        if (CollectionUtils.isEmpty(jobExecutors)) {
                            continue;
                        }
                        for (String jobExecutor : jobExecutors) {
                            String runOneTimePath = JobNodePath.getRunOneTimePath(jobName, jobExecutor);
                            if (null != curatorFramework.checkExists().forPath(runOneTimePath)) {// runOneTime node is junk data
                                SaturnJunkData saturnJunkData = new SaturnJunkData();
                                saturnJunkData.setPath(runOneTimePath);
                                saturnJunkData.setNamespace(namespace);
                                saturnJunkData.setType(SaturnJunkDataOpType.DELETE.toString());
                                saturnJunkData.setDescription("runOneTime");
                                saturnJunkData.setZkAddr(zkBootstrapKey);
                                saturnJunkDataList.add(saturnJunkData);
                            }

                            String stopOneTimePath = JobNodePath.getStopOneTimePath(jobName, jobExecutor);
                            if (null != curatorFramework.checkExists().forPath(stopOneTimePath)) {// stopOneTime node is junk data
                                SaturnJunkData saturnJunkData = new SaturnJunkData();
                                saturnJunkData.setPath(stopOneTimePath);
                                saturnJunkData.setNamespace(namespace);
                                saturnJunkData.setType(SaturnJunkDataOpType.DELETE.toString());
                                saturnJunkData.setDescription("stopOneTime");
                                saturnJunkData.setZkAddr(zkBootstrapKey);
                                saturnJunkDataList.add(saturnJunkData);
                            }

                            String shardingPath = JobNodePath.getServerSharding(jobName, jobExecutor);
                            // $Jobs/servers/executors/executorName/sharding has contents, but this executor is offline,this contents is junk data
                            if (!Strings.isNullOrEmpty(getData(curatorFramework, shardingPath))
                                    && null == curatorFramework.checkExists()
                                            .forPath(ExecutorNodePath.getExecutorIpNodePath(jobExecutor))) {
                                SaturnJunkData saturnJunkData = new SaturnJunkData();
                                saturnJunkData.setPath(shardingPath);
                                saturnJunkData.setNamespace(namespace);
                                saturnJunkData.setType(SaturnJunkDataOpType.CLEAR.toString());
                                saturnJunkData
                                        .setDescription("shardingexecutor?");
                                saturnJunkData.setZkAddr(zkBootstrapKey);
                                saturnJunkDataList.add(saturnJunkData);
                            }
                        }
                    } else if (!CollectionUtils
                            .isEmpty(curatorFramework.getChildren().forPath(JobNodePath.getJobNodePath(jobName)))) {
                        // if $Jobs/jobName/config is not exists, but $Jobs/jobName/xxx exists,then $Jobs/jobName is junk data
                        SaturnJunkData saturnJunkData = new SaturnJunkData();
                        saturnJunkData.setType(SaturnJunkDataOpType.DELETE.toString());
                        saturnJunkData.setPath(JobNodePath.getJobNodePath(jobName));
                        saturnJunkData.setNamespace(namespace);
                        saturnJunkData.setDescription("$Jobs/" + jobName
                                + "/config?");
                        saturnJunkData.setZkAddr(zkBootstrapKey);
                        saturnJunkDataList.add(saturnJunkData);
                    }
                }
            } catch (Exception e) {
                log.error("getJunkData exception:", e);
            }
        }
        return saturnJunkDataList;
    }

    public String getData(final CuratorFramework curatorClient, final String znode) {
        try {
            if (null != curatorClient.checkExists().forPath(znode)) {
                byte[] getZnodeData = curatorClient.getData().forPath(znode);
                if (getZnodeData == null) {// executor?sharding??null?null??new
                    // String
                    return null;
                }
                return new String(getZnodeData, Charset.forName("UTF-8"));
            } else {
                return null;
            }
        } catch (final NoNodeException ex) {
            return null;
            // CHECKSTYLE:OFF
        } catch (final Exception ex) {
            // CHECKSTYLE:ON
            throw new JobConsoleException(ex);
        }
    }

    @Override
    public String removeSaturnJunkData(SaturnJunkData saturnJunkData) {
        try {
            ArrayList<RegistryCenterConfiguration> registryCenterList = RegistryCenterServiceImpl.ZKADDR_TO_ZKCLUSTER_MAP
                    .get(saturnJunkData.getZkAddr()).getRegCenterConfList();
            if (CollectionUtils.isEmpty(registryCenterList)) {
                return "???zk key:" + saturnJunkData.getZkAddr()
                        + "??";
            }
            for (RegistryCenterConfiguration registryCenter : registryCenterList) {
                String namespace = registryCenter.getNameAndNamespace();
                RegistryCenterClient registryCenterClient = RegistryCenterServiceImpl
                        .getCuratorByNameAndNamespace(namespace);
                if (registryCenterClient == null) {
                    continue;
                }
                CuratorFramework curatorFramework = registryCenterClient.getCuratorClient();
                if (SaturnJunkDataOpType.CLEAR.toString().equals(saturnJunkData.getType())) {
                    if (null != curatorFramework.checkExists().forPath(saturnJunkData.getPath())) {
                        curatorFramework.inTransaction().check().forPath(saturnJunkData.getPath()).and().setData()
                                .forPath(saturnJunkData.getPath(), "".getBytes(Charset.forName("UTF-8"))).and()
                                .commit();
                    }
                } else if (SaturnJunkDataOpType.DELETE.toString().equals(saturnJunkData.getType())) {
                    if (null != curatorFramework.checkExists().forPath(saturnJunkData.getPath())) {
                        curatorFramework.delete().deletingChildrenIfNeeded().forPath(saturnJunkData.getPath());
                    }
                }
            }
            return SaturnConstants.DEAL_SUCCESS;
        } catch (Exception e) {
            log.error("removeSaturnJunkData exception:", e);
            return "??:" + e.getMessage();
        }
    }

}