使用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>();@Overridepublic 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 blocke.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();}}}
好像好久都没有做过图形化东西了。 这次总算是给我逮到机会了。上图一张

转载请注明作者和出处,并添加本页链接。
原文链接: //xiaochun.zrlog.com/70.html