You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:45:00