package com.dianping.pigeon.remoting.invoker.process.statistics;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.dianping.pigeon.log.Logger;
import com.dianping.pigeon.log.LoggerLoader;
import com.dianping.pigeon.remoting.common.domain.InvocationRequest;
import com.dianping.pigeon.remoting.common.util.Constants;
public final class InvokerStatisticsHolder {
private static final Logger logger = LoggerLoader.getLogger(InvokerStatisticsHolder.class);
private static ConcurrentHashMap<String, InvokerCapacityBucket> appCapacityBuckets = new ConcurrentHashMap<String, InvokerCapacityBucket>();
public static void init() {
}
public static Map<String, InvokerCapacityBucket> getCapacityBuckets() {
return appCapacityBuckets;
}
public static InvokerCapacityBucket getCapacityBucket(InvocationRequest request, String targetApp) {
String toApp = targetApp;
if (toApp == null) {
toApp = "";
}
InvokerCapacityBucket barrel = appCapacityBuckets.get(toApp);
if (barrel == null) {
InvokerCapacityBucket newBarrel = new InvokerCapacityBucket(toApp);
barrel = appCapacityBuckets.putIfAbsent(toApp, newBarrel);
if (barrel == null) {
barrel = newBarrel;
}
}
return barrel;
}
public static void flowIn(InvocationRequest request, String targetApp) {
if (checkRequestNeedStat(request)) {
InvokerCapacityBucket barrel = getCapacityBucket(request, targetApp);
if (barrel != null) {
barrel.flowIn(request);
}
}
}
public static void flowOut(InvocationRequest request, String targetApp) {
if (checkRequestNeedStat(request)) {
InvokerCapacityBucket barrel = getCapacityBucket(request, targetApp);
if (barrel != null) {
barrel.flowOut(request);
}
}
}
public static boolean checkRequestNeedStat(InvocationRequest request) {
if (request == null || request.getMessageType() != Constants.MESSAGE_TYPE_SERVICE) {
return false;
}
return true;
}
public static void removeCapacityBucket(String fromApp) {
appCapacityBuckets.remove(fromApp);
}
}