在我们应用经常需要统计一些计数,比如调用次数等。典型代码如下:
Keys keys = newKeys("XXX","doSomething");
MonitorLog.addStat(keys, System.currentTimeMillis()-begin, 1L);
在监控系统的页面上就能看到准实时的数据。
这是一个典型的计数器应用,实现也是比较经典。
类图
处理流程:
1. 初始化:
MonitorLog被加载时执行其static区代码:
static { /** 动态创建日志记录的配置 */
String userHome = System.getProperty(MonitorConstants.USER_HOME);
if(!userHome.endsWith(File.separator)) {
userHome+= File.separator;
}
String filePath = userHome+ MonitorConstants.DIR_NAME + File.separator;
File dir = newFile(filePath);
if (!dir.exists()) {
dir.mkdirs();
}
……
String classLoader =MonitorLog.class.getClassLoader().toString();
classLoader =classLoader.split("@")[0];
initAppLog4j(filePath,classLoader);
initMiddlewareLog4j(filePath,classLoader);
setHostName();
runWriteThread();
}
1)在用户的根目录下创建日志目录,linux下是/home/$user/logs/monitor
2)初始化应用日志文件,Logger和对应Appender,使用classloader名称作为文件名,使用DailyRollingFileAppender
3)同样方式初始化中间件的日志文件和Appender
4)启动flush线程
2. 应用方调用MonitorLog.addStat()方法,写日志
1) 从cache中获取key对应的ValueObject,如果没有,则创建之,同时如果cache的size超过默认100000,则该key被丢弃
使用RetreenLock+doublecheck实现。此处代码略有多余,使用ConcurrentHashMap的putIfAbsent即可。
2) 调用ValueObject. addCount()递增计数,代码:
long[]current;
long[] update = new long[NUM_VALUES];
do {
current= values.get();
update[0] = current[0] + value1;
update[1] = current[1] + value2;
} while(!values.compareAndSet(current, update));
使用CAS实现并发递增,使用AtomicReference实现对计数同步更新
3. flush线程,实现cache数据的定期刷新,2分钟一次
1) 周期控制,代码:
while (true) {
timerLock.lock();
try {
condition.await(waitTime, TimeUnit.SECONDS);
} catch (Exception e) {
logger.error("wait error", e);
} finally {
timerLock.unlock();
}
使用Condition的await实现。此处单线程用Thread.sleep更加简单实现。如果是多线程场景,condition.await可以提供另一种调度控制方式,对开发比较友好(await/signal)。
2) writeLog()调用,使用log4j刷日志到磁盘.
a. 使用临时Map存放待刷磁盘的数据快照
b. 遍历原始map数据,拼装成一个SringBuilder,并将Key数据快照存入临时Map
c. 将日志刷磁盘
if (tmp.size() > 0 && writeLog) {
appStatLog.info(sb);
}
d. 根据之前key的数据快照递减原始计数
// 循环把已经写入文件的数据从datas中减少
for (Keys key: tmp.keySet()) {
long[]values = tmp.get(key).getValues();
appDatas.get(key).deductCount(values[0],values[1]);
}
e. 同样方式刷中间件的日志数据
f. MonitorLog刷到磁盘的数据,会由哈勃的agent定期回收到哈勃服务端存储
小结:
1. 使用Map务必注意map引起的内存泄漏问题,size检查必不可少
2. Flush线程和业务线程并发控制很重要,使用CAS以提高并发性能
3. 需要对同一个对象的不同属性进行原子更新时,可以使用AtomicReference+CAS实现
分享到:
相关推荐
标题中的“0556、计数器电路应用于自行车”是一个项目名称,它涉及的是将电子计数器技术应用于自行车的实例。在这个项目中,计数器通常用于记录自行车的行驶里程或者其他运动指标。计数器电路是电子工程中一个基础且...
计数器电路通常用于计算某个事件的发生次数,比如在自行车上,它可以用来统计骑行者的圈数或者距离。 在电子设计领域,计数器电路是数字逻辑设计的一个基本部分,主要由触发器(如D触发器或JK触发器)和门电路(如...
STM32外部计数器程序是针对嵌入式系统中常用的一种硬件接口功能,它能够对来自外部信号源的脉冲进行计数,通常用于采集传感器数据,如编码器的脉冲信号。在这个程序中,重点是利用STM32的定时器(TIM1和TIM2)配置为...
在工业自动化领域,组态软件被广泛应用于监控与数据采集系统(SCADA)中,帮助用户实现对现场设备的数据采集、监控以及数据分析等功能。组态王作为一款流行的国产组态软件,提供了丰富的组件和功能,方便用户快速...
在VC++(Visual C++)开发环境中,创建定时器和计数器是一项常见的任务,尤其在需要周期性执行某些操作或者进行时间间隔控制的应用中。虽然VC++的标准库中并没有直接提供现成的定时器控件,但我们可以通过利用...
例如,我们可以选择TIMx的自动重载寄存器(ARR)为某个适当值,使得每个定时器周期为1ms,然后设置预分频器以确保计数器在1ms内溢出,触发ADC转换。 在编程时,我们需要初始化ADC和定时器,包括但不限于以下步骤: ...
经过分析和测试,研究者们发现通过改变滤波器的选型,将FIR数字滤波器更改为“CIC数字滤波器(级联积分梳妆数字滤波器)+IIR数字滤波器(无限冲击响应数字滤波器)”并配合优化的采集计数器跳转条件,可以有效消除“台阶...
在单片机系统中,定时和计数功能是非常重要的,它们广泛应用于各种实时控制、信号处理和数据采集任务中。MCS系列单片机,特别是MCS-51,内置了两个16位可编程的定时器/计数器,为开发者提供了极大的灵活性。本文将...
在电子工程和嵌入式系统领域,频率计、定时器和计数器是常见的功能模块,它们在各种应用中起到至关重要的作用。本项目利用51单片机(51系列微控制器)的Timer0(T0)和Timer1(T1)来实现一个频率计和计数器的功能,...
在频谱仪数据采集的具体应用中,可以通过NI USB-6009数据采集卡实现信号的实时采集与分析。例如,对于某个特定频率范围内的信号,可以通过配置合适的采样率和通道设置,利用A/D转换器将模拟信号转换为数字信号,再...
DAQ(数据采集)是将物理信号转换为数字数据的过程,这些数据可以进一步分析或存储。 **研华DAQ设备** 研华的DAQ设备涵盖了各种接口类型,如PCI、USB、PCIe、以太网等,能够满足不同应用需求。这些设备通常带有模拟...
4. **不同类型的计数器应用示例** 5. **常见单片机(如8051、AVR、ARM等)的计数器特性比较** 6. **实际项目中的计数电路设计和调试经验分享** 掌握单片机计数电路的应用是成为一名合格的嵌入式硬件工程师的关键...
单片机中断系统和定时计数器是...中断系统和定时计数器在单片机应用中非常常见,例如在实时数据采集、实时控制系统、定时任务调度等方面都有广泛的应用。了解和掌握这些知识点对于理解和设计基于单片机的系统至关重要。
在评估室内空气质量时,可能需要使用LabVIEW编程环境开发应用程序,用于实时监控、记录和分析Fluke 983粒子计数器的数据。 文件内容中出现了一些OCR扫描错误,如“IAQSBS1.IAQIAQA1B”、“Fluke9836C”、“5/CO2”...
在电子政务领域,技术的应用是不可或缺的一部分,尤其是在数据采集、传输和处理方面。"可防止光干扰的计数器光电编码组件"是一个重要的技术概念,它涉及到自动化、传感器技术和信号处理等多个方面。在这个主题中,...
ASP.NET是一种基于.NET Framework的服务器端网页开发技术,由微软公司推出,用于构建高度交互的Web应用程序。在本例中,我们关注的是一个名为“多线程数据采集器”的源码,它使用C# 2.0编程语言实现,并与ASP.NET...
通过这个简单的例子,我们可以进一步探索Labview在更复杂算法和系统中的应用,如数据分析、信号处理等。 在实际应用中,Labview的强大之处在于其可视化编程方式,使得非程序员也能快速上手,进行实验或工程项目的...
- I/F转换原理:电流积分型I/F转换电路的工作原理及其在加速度计数据采集中的应用。 - 高精度数据采集:如何提高对微小加速度的实时测量能力,尤其是小信号的处理。 - SOPC技术:利用SOPC技术在FPGA内部生成高可靠性...
#### 四、温度采集应用实例 **硬件接口电路**: - 实验板上的DS18B20温度传感器接口通常与单片机的某个I/O口相连。 - 数码管用于显示温度值,字形码数据通过另一I/O口送入,各数码管的显示选择信号由不同的I/O口...