求助:如何用SNMP4J采集60秒localhost CPU使用率并通过JFreeChart展示
Hey Sean! 你已经搞定了SNMP4J获取CPU使用率的核心逻辑,接下来要实现60秒的连续数据采集+JFreeChart可视化其实很清晰,我给你拆解成几个关键步骤,附代码示例:
实现步骤拆解
1. 封装采集数据实体
先定义一个简单的类来存储每次采集的时间戳和CPU使用率,方便后续处理:
public class CPUData { private long timestamp; // 毫秒级时间戳 private double usage; // CPU使用率(0-100) public CPUData(long timestamp, double usage) { this.timestamp = timestamp; this.usage = usage; } // Getter方法,供后续读取数据使用 public long getTimestamp() { return timestamp; } public double getUsage() { return usage; } }
2. 用定时任务实现每秒采集
使用ScheduledExecutorService来创建定时任务,每隔1秒执行一次SNMP采集,持续60秒后自动停止。这里假设你已经有了getCPUUsageViaSNMP()方法来获取CPU使用率,直接复用即可:
import org.snmp4j.smi.OID; import java.util.concurrent.*; import java.util.List; public class CPUCollector { // 这里是你已有的SNMP4J获取CPU使用率的方法,替换成你的实际逻辑 private double getCPUUsageViaSNMP() { // 示例:模拟返回0-100的随机使用率,实际替换为你的SNMP采集代码 try { // 你的SNMP4J逻辑:创建Snmp实例、发送请求、解析响应获取CPU使用率 // 比如针对localhost的SNMP服务,使用对应的CPU使用率OID(如.1.3.6.1.2.1.25.3.3.1.2.1) return Math.random() * 100; } catch (Exception e) { e.printStackTrace(); return 0.0; // 采集失败时返回默认值,避免任务中断 } } public void startCollectionAndDisplay() { // 线程安全的集合,用于存储60秒内的所有采集数据 List<CPUData> cpuDataList = new CopyOnWriteArrayList<>(); ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // 启动定时任务:首次立即执行,之后每隔1秒执行一次 ScheduledFuture<?> collectionTask = scheduler.scheduleAtFixedRate(() -> { long currentTime = System.currentTimeMillis(); double currentUsage = getCPUUsageViaSNMP(); cpuDataList.add(new CPUData(currentTime, currentUsage)); System.out.printf("采集时间: %d, CPU使用率: %.2f%%%n", currentTime, currentUsage); }, 0, 1, TimeUnit.SECONDS); // 60秒后停止采集,并触发图表展示 scheduler.schedule(() -> { collectionTask.cancel(true); // 停止采集任务 scheduler.shutdown(); // 关闭调度器 generateChart(cpuDataList); // 生成JFreeChart图表 }, 60, TimeUnit.SECONDS); } // 用JFreeChart生成并展示CPU使用率趋势图 private void generateChart(List<CPUData> cpuDataList) { // 创建时间序列数据集 org.jfree.data.time.TimeSeries cpuSeries = new org.jfree.data.time.TimeSeries("CPU使用率 (%)"); for (CPUData data : cpuDataList) { // 将毫秒时间戳转换为JFreeChart支持的Millisecond对象 org.jfree.data.time.Millisecond timePoint = new org.jfree.data.time.Millisecond(new java.util.Date(data.getTimestamp())); cpuSeries.add(timePoint, data.getUsage()); } org.jfree.data.time.TimeSeriesCollection dataset = new org.jfree.data.time.TimeSeriesCollection(cpuSeries); // 创建时间序列图表 org.jfree.chart.JFreeChart chart = org.jfree.chart.ChartFactory.createTimeSeriesChart( "60秒CPU使用率趋势", "时间", "使用率 (%)", dataset, true, // 显示图例 true, // 显示工具提示 false // 不显示URL链接 ); // 展示图表窗口 org.jfree.chart.ChartFrame chartFrame = new org.jfree.chart.ChartFrame("CPU实时监控", chart); chartFrame.pack(); chartFrame.setVisible(true); } public static void main(String[] args) { new CPUCollector().startCollectionAndDisplay(); } }
3. 关键注意事项
- SNMP服务配置:确保localhost的SNMP服务已经开启,并且你使用的CPU使用率OID正确(不同系统的OID可能不同,比如Linux常用
.1.3.6.1.2.1.25.3.3.1.2.1,Windows可能有差异)。 - JFreeChart依赖:如果使用Maven,需要在
pom.xml中添加依赖:
<dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.5.3</version> </dependency>
- 异常处理:在
getCPUUsageViaSNMP()方法中一定要捕获SNMP相关异常(比如IOException),避免一次采集失败导致整个定时任务终止。 - 线程安全:使用
CopyOnWriteArrayList保证多线程环境下的数据安全,因为定时任务是在后台线程执行的,主线程可能同时读取数据生成图表。
内容的提问来源于stack exchange,提问作者Sean.Wong
相关产品推荐
相关产品推荐

