package com.dianping.pigeon.remoting.provider.process.statistics;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.dianping.pigeon.log.Logger;
import com.dianping.pigeon.log.LoggerLoader;
public class ProviderStatisticsChecker implements Runnable {
private static final Logger logger = LoggerLoader.getLogger(ProviderStatisticsChecker.class);
@Override
public void run() {
ProviderStatisticsHolder.init();
ProviderCapacityBucket.init();
int i = 0;
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
Map<String, ProviderCapacityBucket> appCapacityBuckets = ProviderStatisticsHolder.getCapacityBuckets();
Map<String, ProviderCapacityBucket> methodCapacityBuckets = ProviderStatisticsHolder.getMethodCapacityBuckets();
Map<String, ConcurrentHashMap<String,ProviderCapacityBucket>> methodAppCapacityBuckets
= ProviderStatisticsHolder.getMethodAppCapacityBuckets();
ProviderCapacityBucket globalCapacityBucket = ProviderStatisticsHolder.getGlobalCapacityBucket();
if (appCapacityBuckets != null && methodCapacityBuckets != null
&& methodAppCapacityBuckets != null && globalCapacityBucket != null) {
try {
for (String key : appCapacityBuckets.keySet()) {
ProviderCapacityBucket bucket = appCapacityBuckets.get(key);
bucket.resetRequestsInSecondCounter();
}
for (String key : methodCapacityBuckets.keySet()) {
ProviderCapacityBucket bucket = methodCapacityBuckets.get(key);
bucket.resetRequestsInSecondCounter();
}
for (String method : methodAppCapacityBuckets.keySet()) {
Map<String, ProviderCapacityBucket> appCapacityBucketMap = methodAppCapacityBuckets.get(method);
for (String app : appCapacityBucketMap.keySet()) {
ProviderCapacityBucket bucket = appCapacityBucketMap.get(app);
bucket.resetRequestsInSecondCounter();
}
}
globalCapacityBucket.resetRequestsInSecondCounter();
if (++i % 12 == 0) {
i = 0;
for (ProviderCapacityBucket bucket : appCapacityBuckets.values()) {
bucket.resetRequestsInMinuteCounter();
}
for (ProviderCapacityBucket bucket : methodCapacityBuckets.values()) {
bucket.resetRequestsInMinuteCounter();
}
for (String method : methodAppCapacityBuckets.keySet()) {
Map<String, ProviderCapacityBucket> appCapacityBucketMap = methodAppCapacityBuckets.get(method);
for (String app : appCapacityBucketMap.keySet()) {
ProviderCapacityBucket bucket = appCapacityBucketMap.get(app);
bucket.resetRequestsInMinuteCounter();
}
}
globalCapacityBucket.resetRequestsInMinuteCounter();
}
} catch (Throwable e) {
logger.error("Check expired request in app statistics failed, detail[" + e.getMessage() + "].", e);
}
}
}
}
}