package com.taobao.yugong.common.stats; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.taobao.yugong.common.model.ProgressStatus; import com.taobao.yugong.common.model.RunMode; /** * 统计下当前各表迁移的状态 * * @author agapple 2014-4-24 下午2:12:13 * @since 3.0.4 */ public class ProgressTracer { private static final Logger logger = LoggerFactory.getLogger(ProgressTracer.class); private static final String FULL_FORMAT = "{未启动:%s,全量中:%s,已完成:%s,异常数:%s}"; private static final String INC_FORMAT = "{未启动:%s,增量中:%s,已追上:%s,异常数:%s}"; private static final String CHECK_FORMAT = "{未启动:%s,对比中:%s,已完成:%s,异常数:%s}"; private static final String ALL_FORMAT = "{未启动:%s,全量中:%s,增量中:%s,已追上:%s,异常数:%s}"; private int total; private RunMode mode; private Map<String, ProgressStatus> status = new ConcurrentHashMap<String, ProgressStatus>(); public ProgressTracer(RunMode mode, int total){ this.mode = mode; this.total = total; } public void update(String tableName, ProgressStatus progress) { ProgressStatus st = status.get(tableName); if (st != ProgressStatus.FAILED) { status.put(tableName, progress); } } public void printSummry() { print(false); } public void print(boolean detail) { int fulling = 0; int incing = 0; int failed = 0; int success = 0; List<String> fullingTables = new ArrayList<String>(); List<String> incingTables = new ArrayList<String>(); List<String> failedTables = new ArrayList<String>(); List<String> successTables = new ArrayList<String>(); for (Map.Entry<String, ProgressStatus> entry : status.entrySet()) { ProgressStatus progress = entry.getValue(); if (progress == ProgressStatus.FULLING) { fulling++; fullingTables.add(entry.getKey()); } else if (progress == ProgressStatus.INCING) { incing++; incingTables.add(entry.getKey()); } else if (progress == ProgressStatus.FAILED) { failed++; failedTables.add(entry.getKey()); } else if (progress == ProgressStatus.SUCCESS) { success++; successTables.add(entry.getKey()); } } int unknow = this.total - fulling - incing - failed - success; String msg = null; if (mode == RunMode.ALL) { msg = String.format(ALL_FORMAT, new Object[] { unknow, fulling, incing, success, failed }); } else if (mode == RunMode.FULL) { msg = String.format(FULL_FORMAT, new Object[] { unknow, fulling, success, failed }); } else if (mode == RunMode.INC) { msg = String.format(INC_FORMAT, new Object[] { unknow, incing, success, failed }); } else if (mode == RunMode.CHECK) { msg = String.format(CHECK_FORMAT, new Object[] { unknow, fulling, success, failed }); } logger.info("{}", msg); if (detail) { if (fulling > 0) { if (mode == RunMode.CHECK) { logger.info("对比中:" + fullingTables); } else { logger.info("全量中:" + fullingTables); } } if (incing > 0) { logger.info("增量中:" + incingTables); } if (failed > 0) { logger.info("异常数:" + failedTables); } logger.info("已完成:" + successTables); } } }