使用JfreeChart与sigar,quartz绘制CPU使用率
在社区中看到有人通过 sigar.jar 包读出了操作系统的硬件信息。 于是产生了强烈的兴趣, 于是就有下面这段代码,利用JfreeChart的 DefaultTableXYDataset 图表做显示。 用quartz做定时刷新数据,sigar 读取系统信息。
Job定时调度
package com.fzb.monitoring.job;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.jfree.data.xy.DefaultTableXYDataset;
import org.jfree.data.xy.XYDataItem;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class CPUJob implements Job {
private static List<Double> l=new LinkedList<Double>();
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Sigar sigar=(Sigar) context.getJobDetail().getJobDataMap().get("sigar");
DefaultTableXYDataset dataset= (DefaultTableXYDataset) context.getJobDetail().getJobDataMap().get("dataset");
CpuPerc cpu;
try {
cpu = sigar.getCpuPerc();
XYSeries s1 = (XYSeries) context.getJobDetail().getJobDataMap().get("series");
if(l.size()>30){
l.remove(0);
l.add(cpu.getCombined());
for(int i=0;i<30;i++){
s1.update(i, l.get(i));
}
}
else{
l.add(cpu.getCombined());
s1.add(l.size(), l.get(l.size()-1));
}
//s1.update(key-60, );
System.out.println("CPU用户使用率: " + CpuPerc.format(cpu.getUser()));// 用户使用率
System.out.println("CPU系统使用率: " + CpuPerc.format(cpu.getSys()));// 系统使用率
System.out.println("CPU当前等待率: " + CpuPerc.format(cpu.getWait()));// 当前等待率
System.out.println("CPU当前错误率: " + CpuPerc.format(cpu.getNice()));//
System.out.println("CPU当前空闲率: " + CpuPerc.format(cpu.getIdle()));// 当前空闲率
System.out.println("CPU总的使用率: " + CpuPerc.format(cpu.getCombined()));// 总的使用率
} catch (SigarException e1) {
e1.printStackTrace();
}
/*String ifNames[];
try {
ifNames = sigar.getNetInterfaceList();
for (int i = 0; i < ifNames.length; i++) {
String name = ifNames[i];
NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
System.out.println("网络设备名: " + name);// 网络设备名
System.out.println("IP地址: " + ifconfig.getAddress());// IP地址
System.out.println("子网掩码: " + ifconfig.getNetmask());// 子网掩码
if ((ifconfig.getFlags() & 1L) <= 0L) {
System.out.println("!IFF_UP...skipping getNetInterfaceStat");
continue;
}
NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
System.out.println(name + "接收的总包裹数:" + ifstat.getRxPackets());// 接收的总包裹数
System.out.println(name + "发送的总包裹数:" + ifstat.getTxPackets());// 发送的总包裹数
System.out.println(name + "接收到的总字节数:" + ifstat.getRxBytes());// 接收到的总字节数
System.out.println(name + "发送的总字节数:" + ifstat.getTxBytes());// 发送的总字节数
System.out.println(name + "接收到的错误包数:" + ifstat.getRxErrors());// 接收到的错误包数
System.out.println(name + "发送数据包时的错误数:" + ifstat.getTxErrors());// 发送数据包时的错误数
System.out.println(name + "接收时丢弃的包数:" + ifstat.getRxDropped());// 接收时丢弃的包数
System.out.println(name + "发送时丢弃的包数:" + ifstat.getTxDropped());// 发送时丢弃的包数
}
}
catch (SigarException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
quartz和Jfreechart做数据的展示和读取。
package fzb.zcc.my;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.awt.Font;
import java.util.Date;
import org.hyperic.sigar.Sigar;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.DefaultTableXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.ScheduleBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fzb.monitoring.job.CPUJob;
public class FirstCron {
private static DefaultTableXYDataset dataset = new DefaultTableXYDataset();
private static XYSeries series = new XYSeries("CPU使用率", true, false);
public void run() throws Exception{
Logger log=LoggerFactory.getLogger(FirstCron.class);
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scher=sf.getScheduler();
JobDetail job = newJob(CPUJob.class)
.withIdentity("job1", "group1")
.build();
job.getJobDataMap().put("dataset", dataset);
job.getJobDataMap().put("sigar", new Sigar());
job.getJobDataMap().put("series", series);
dataset.addSeries(series);
JFreeChart chart=ChartFactory.createXYAreaChart("使用JfreeChart与sigar绘制CPU使用率","", "",(XYDataset)job.getJobDataMap().get("dataset") ,PlotOrientation.VERTICAL, true,true,true);
//title(上部分)
TextTitle title=chart.getTitle();
title.setFont(new Font("幼圆", Font.BOLD, 20));
//legend(底部)
LegendTitle legend=chart.getLegend();
legend.setItemFont(new Font("华文彩云", Font.ITALIC, 14));
//plot(中部)
XYPlot plot=chart.getXYPlot();
//plot.set.setLabelFont(new Font("宋体",Font.BOLD,16));
ChartFrame frame=new ChartFrame("JAVA绘制CPU使用率", chart);
frame.pack();
frame.setVisible(true);
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(2))
.build();
scher.scheduleJob(job, trigger);
log.info(scher.getJobGroupNames()+"");
scher.start();
}
public static void main(String[] args) {
try {
new FirstCron().run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
好像好久都没有做过图形化东西了。 这次总算是给我逮到机会了。上图一张
Reproduced please indicate the author and the source, and error a link to this page.
text link:
//xiaochun.zrlog.com/70.html