/** * 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.internal.statistics; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; /** * 统计处理数据数量的类. * * */ public final class ProcessCountStatistics { private static ConcurrentMap<String, AtomicInteger> successCountMap = new ConcurrentHashMap<>(); private static ConcurrentMap<String, AtomicInteger> failureCountMap = new ConcurrentHashMap<>(); private static ConcurrentMap<String, AtomicInteger> totalCountDeltaMap = new ConcurrentHashMap<>(); private static ConcurrentMap<String, AtomicInteger> errorCountDeltaMap = new ConcurrentHashMap<>(); private static String buildKey(String executorName, String jobName) { return executorName + "_" + jobName; } public static void initTotalCountDelta(final String executorName, final String jobName, final int processCount) { totalCountDeltaMap.put(buildKey(executorName, jobName), new AtomicInteger(processCount)); } public static void initErrorCountDelta(final String executorName, final String jobName, final int errorCount) { errorCountDeltaMap.put(buildKey(executorName, jobName), new AtomicInteger(errorCount)); } public static synchronized void increaseTotalCountDelta(final String executorName, final String jobName) { incrementProcessCount(buildKey(executorName, jobName), totalCountDeltaMap); } public static synchronized void increaseErrorCountDelta(final String executorName, final String jobName) { incrementProcessCount(buildKey(executorName, jobName), errorCountDeltaMap); } public static int getTotalCountDelta(final String executorName, final String jobName) { String key = buildKey(executorName, jobName); return null == totalCountDeltaMap.get(key) ? 0 : totalCountDeltaMap.get(key).get(); } public static int getErrorCountDelta(final String executorName, final String jobName) { String key = buildKey(executorName, jobName); return null == errorCountDeltaMap.get(key) ? 0 : errorCountDeltaMap.get(key).get(); } /** * 增加本作业服务器处理数据正确的数量. * * @param executorName executor名 * @param jobName 作业名称 */ public static synchronized void incrementProcessSuccessCount(final String executorName, final String jobName) { incrementProcessCount(buildKey(executorName, jobName), successCountMap); } /** * 增加本作业服务器处理数据正确的数量. * * @param executorName executor名 * @param jobName 作业名称 * @param successCount 处理数据正确的数量 */ public static synchronized void incrementProcessSuccessCount(final String executorName, final String jobName, final int successCount) { incrementProcessCount(buildKey(executorName, jobName), successCount, successCountMap); } /** * 增加本作业服务器处理数据错误的数量. * * @param executorName executor名 * @param jobName 作业名称 */ public static synchronized void incrementProcessFailureCount(final String executorName, final String jobName) { incrementProcessCount(buildKey(executorName, jobName), failureCountMap); } /** * 增加本作业服务器处理数据错误的数量. * * @param executorName executor名 * @param jobName 作业名称 * @param failureCount 处理数据错误的数量 */ public static void incrementProcessFailureCount(final String executorName, final String jobName, final int failureCount) { incrementProcessCount(buildKey(executorName, jobName), failureCount, failureCountMap); } private static void incrementProcessCount(final String key, final ConcurrentMap<String, AtomicInteger> processCountMap) { processCountMap.putIfAbsent(key, new AtomicInteger(0)); processCountMap.get(key).incrementAndGet(); } private static void incrementProcessCount(final String key, final int count, final ConcurrentMap<String, AtomicInteger> processCountMap) { processCountMap.putIfAbsent(key, new AtomicInteger(0)); processCountMap.get(key).addAndGet(count); } /** * 获取本作业服务器处理数据正确的数量. * * @param executorName executor名 * @param jobName 作业名称 * @return 本作业服务器处理数据正确的数量 */ public static int getProcessSuccessCount(final String executorName, final String jobName) { String key = buildKey(executorName, jobName); return null == successCountMap.get(key) ? 0 : successCountMap.get(key).get(); } /** * 获取本作业服务器处理数据错误的数量. * * @param executorName executor名 * @param jobName 作业名称 * @return 本作业服务器处理数据错误的数量 */ public static int getProcessFailureCount(final String executorName, final String jobName) { String key = buildKey(executorName, jobName); return null == failureCountMap.get(key) ? 0 : failureCountMap.get(key).get(); } /** * 重置success/failure统计信息. analyse的totalCount和errorCount不清零。 * * @param executorName executor名 * @param jobName 作业名称 */ public static void resetSuccessFailureCount(final String executorName, final String jobName) { String key = buildKey(executorName, jobName); if (successCountMap.containsKey(key)) { successCountMap.get(key).set(0); } if (failureCountMap.containsKey(key)) { failureCountMap.get(key).set(0); } } /** * 重置analyse统计信息. servers底下的success/failure不清零。 * @param executorName * @param jobName */ public static void resetAnalyseCount(final String executorName, final String jobName) { String key = buildKey(executorName, jobName); if (totalCountDeltaMap.containsKey(key)) { totalCountDeltaMap.get(key).set(0); } if (errorCountDeltaMap.containsKey(key)) { errorCountDeltaMap.get(key).set(0); } } }