zoukankan      html  css  js  c++  java
  • Java 监控请求

    监控对象

    
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.concurrent.ConcurrentHashMap;
    
    
    /**
     * 监控对象
     * 
     * @author solq
     * */
    public class Monitor {
    		/** 每分钟记录 */
    	private ConcurrentHashMap<Long, Integer> record = new ConcurrentHashMap<>();
    	/** 记录间隔 */
    	private long recordInterval;
    	/** 清理间隔 */
    	private long cleanInterval;
    	/** 记录名称 */
    	private String name;
    	/** 最后清理时间 */
    	private long lastClean = System.currentTimeMillis();
    
    	public static Monitor valueOf(String name, long recordInterval,
    			long cleanInterval) {
    		Monitor result = new Monitor();
    		result.name = name;
    		result.recordInterval = recordInterval;
    		result.cleanInterval = cleanInterval;
    		return result;
    	}
    
    	public void record() {
    		final long start = System.currentTimeMillis();
    		// 去掉除数 达到取上一时间点效果
    		final long key = (start / recordInterval) * recordInterval;
     		if (Math.abs((start- lastClean)) > cleanInterval) {
    			synchronized (this) {
    				if (Math.abs((start- lastClean))> cleanInterval) {
    					printlnAndClean();
    				}
    			}
    		}
    
    		record(key);
    	}
    
    	void record(Long key) {
    		while (true) {
    			Integer value = record.get(key);
    			if (value == null) {
    				if (record.putIfAbsent(key, 1) == null) {
    					break;
    				}
    			} else {
    				if (record.replace(key, value, value + 1)) {
    					break;
    				}
    			}
    		}
    	}
    
    	/**
    	 * 打印并清理记录
    	 * */
    	private void printlnAndClean() {
    		lastClean = System.currentTimeMillis();
    		Map<Long, Integer> data = new HashMap<>(record);
    		record.clear();
    		for (Entry<Long, Integer> entry : data.entrySet()) {
    			System.err.println(name
    					+ " Monitor : "
    					+ DateUtils.date2String(new Date(entry.getKey()),
    							DateUtils.PATTERN_DATE_TIME) + " : "
    					+ entry.getValue());
    		}
    	}
    
    }
    
    

    监控使用包装

    /**
     * 请求监控工具
     * 
     * @author solq
     * */
    public abstract class RequestMonitorUtil {
    	private static Monitor commandMonitor = Monitor.valueOf("命令代理", 60 * 1000,
    			60 * 60 * 1000);
    	private static Monitor sqlMonitor = Monitor.valueOf("sql代理", 60 * 1000,
    			60 * 60 * 1000);
    
    	public static void recordSql() {
    		try {
    			commandMonitor.record();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static void recordCommand() {
    		try {
    			sqlMonitor.record();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}		
    	}
    }
    
    
  • 相关阅读:
    vue-cli项目npm run build后,index.html无法在浏览器打开
    前端工具
    关于 IIS 中 iconfont.woff 报 404(Not Found) 的原因即解决方法
    表格行上下移动、置顶的Javascript代码
    纯js国际化(使用技术:i18n)
    【整理】前端国际化小结
    js比较两个数字的大小不能直接比
    input事件中文触发多次问题研究
    linux(centos8):使用tree命令查看目录结构
    nginx安全:配置网站图片防盗链
  • 原文地址:https://www.cnblogs.com/solq/p/4686270.html
Copyright © 2011-2022 走看看