- /**
- * 简单的实现基于URL的流控
- */
- public class TrafficControl {
- //一个url请求的最大访问数量为300
- private final static intONE_URI_MAX_CONCURRENT = 300;
- //所有url请求的最大访问数量为500
- private final static intALL_URI_MAX_CONCURRENT = 500;
- private final staticAtomicInteger all_url_concurrent =newAtomicInteger(0);
- private final staticConcurrentMap url_concurrent_map = newConcurrentHashMap();
- private final staticSwitcherManager switcherManager = SwitcherManagerFactoryLoader.getSwitcherManagerFactory().getSwitcherManager();
- private final staticSwitcher tcEnabled = switcherManager.registerSwitcher("feature.trackurl.traffic_control.enable",true);
- public static boolean isDisabled() {
- return tcEnabled.isClose();
- }
- public static boolean isOverflow(String uri) {
- if(all_url_concurrent.get() > ALL_URI_MAX_CONCURRENT) {
- return true;
- }
- AtomicInteger one_url_concurrent = url_concurrent_map.get(uri);
- if(one_url_concurrent !=null&& one_url_concurrent.get() > ONE_URI_MAX_CONCURRENT) {
- return true;
- }
- return false;
- }
- public static void startAccess(String uri) {
- all_url_concurrent.incrementAndGet();
- AtomicInteger one_url_concurrent = url_concurrent_map.get(uri);
- if(one_url_concurrent !=null) {
- one_url_concurrent.incrementAndGet();
- } else {
- url_concurrent_map.putIfAbsent(uri, newAtomicInteger(1));
- }
- }
- public static void endAccess(String uri) {
- all_url_concurrent.decrementAndGet();
- AtomicInteger one_url_concurrent = url_concurrent_map.get(uri);
- if(one_url_concurrent !=null) {
- one_url_concurrent.decrementAndGet();
- }
- }
- public static void dumpWarnLog() {
- String lineSeparator = System.getProperty("line.separator");
- // 估算每一个URL和其计数占用32个字符StringBuilder sb =newStringBuilder((1 + url_concurrent_map.size()) * 32);
- sb.append("all_url_concurrent : ").append(all_url_concurrent);
- for(Map.Entry entry : url_concurrent_map.entrySet()) {
- sb.append(lineSeparator).append('\t').append(entry.getKey()).append(" : ").append(entry.getValue());
- }
- ApiLogger.warn(sb);
- }
- }
来源: http://www.cnblogs.com/ficohu/p/6819292.html