import java.util.concurrent.ConcurrentMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.RateLimiter;
/**
* @author fuyongqian
*
*/
public class TrafficShaper {
private static final Logger log = LoggerFactory.getLogger(TrafficShaper.class);
private static final ConcurrentMap<String,Double> resoureMap = Maps.newConcurrentMap();
private static final ConcurrentMap<String,RateLimiter> limiterMap = Maps.newConcurrentMap();
public static void updateResourceQps(String userkey,double qps){
resoureMap.put(userkey, qps);
if(qps > 0.0){
RateLimiter limiter = limiterMap.get(userkey);
if (limiter!=null ){
if (limiter.getRate() != qps){
limiter.setRate(qps);
}
}else{
limiter = RateLimiter.create(qps);
RateLimiter putByOtherThread = limiterMap.putIfAbsent(userkey, limiter);
if (putByOtherThread != null) limiter = putByOtherThread;
}
}
}
public static void removeResourcesQps(String userkey){
resoureMap.remove(userkey);
}
public static boolean enter (String userkey){
if (resoureMap == null){
return true;
}
double qps = resoureMap.get(userkey) != null ? resoureMap.get(userkey):0;
if (qps <= 0.0){
return true;
}
RateLimiter limiter = limiterMap.get(userkey);
if (limiter == null){
log.info("userkey为"+userkey+"的限流对象初始化异常或没有初始化");
return true;
}
return limiter.tryAcquire();
}
}