package com.dianping.pigeon.remoting.invoker.route.statistics; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import com.dianping.pigeon.log.Logger; import com.dianping.pigeon.log.LoggerLoader; public class CapacityChecker implements Runnable { private static final Logger logger = LoggerLoader.getLogger(CapacityChecker.class); @Override public void run() { ServiceStatisticsHolder.init(); while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(5000); } catch (InterruptedException e) { } if (ServiceStatisticsHolder.getCapacityBuckets() != null) { try { long currentTimeMillis = System.currentTimeMillis(); for (CapacityBucket bucket : ServiceStatisticsHolder.getCapacityBuckets().values()) { bucket.resetRequestInSecondCounter(); try { Map<Long, Float> expiredRequests = new HashMap<Long, Float>(); for (Iterator<Entry<Long, Object[]>> iter = bucket.getRequestSeqDetails().entrySet() .iterator(); iter.hasNext();) { Entry<Long, Object[]> detailEntry = iter.next(); Object[] details = detailEntry.getValue(); long requestFlowInTime = (Long) details[0]; int requestTimeout = (Integer) details[1]; Float requestFlow = (Float) details[2]; if (currentTimeMillis - requestFlowInTime >= 2 * requestTimeout) { expiredRequests.put(detailEntry.getKey(), requestFlow); } } for (Entry<Long, Float> expiredEntry : expiredRequests.entrySet()) { bucket.flowOut(expiredEntry.getKey(), expiredEntry.getValue()); } } catch (Throwable e) { logger.error("Check expired request in service statistics failed, detail[" + e.getMessage() + "].", e); } } } catch (Throwable e) { logger.error("Check expired request in service statistics failed, detail[" + e.getMessage() + "].", e); } } } } }