本文主要记录下学习如何运用JRboin画图的一些测试代码。
本次测试画图用到的测试数据demo_flow.rrd文件,是来自之前写的 SNMP系列之(一)JRobin Core学习中的方法生成的,可供大家参考。JRboin的画图主要从下面两方面:
- 直接定义RrdGraphDef对象画图
- 根据定义好的模板XML文件生成图片
下面是我学习时生成图片的测试代码以及定义的模板文件:
package com.snmp.jrobin; import java.awt.Color; import java.awt.Font; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import org.jrobin.core.Util; import org.jrobin.graph.RrdGraph; import org.jrobin.graph.RrdGraphDef; import org.jrobin.graph.RrdGraphDefTemplate; import org.xml.sax.InputSource; /** * @author Michael * */ public class TestGraphCommon { /** * @param args */ public static void main(String[] args) { String rootPath = "d:/test/jrobin/"; String imgFileName = "demo_graph_rrd.png"; TestGraphCommon test = new TestGraphCommon(); // 测试直接定义画图模板生成图片 test.graphByGraphDef(rootPath, imgFileName); String tempName = "graph-def-template.xml"; // 测试根据定义的XML模板文件生成图片 test.graphByTemplate(rootPath, tempName); } /** * 直接定义画图模板生成图片 * @param rootPath * @param imgFileName */ private void graphByGraphDef(String rootPath, String imgFileName) { try { System.out.println("[rrd graph by RrdGraphDef start...]"); // 2010-10-01:1285862400L 2010-11-01:1288540800L long startTime = Util.getTimestamp(2010, 10 - 1, 1); long endTime = Util.getTimestamp(2010, 10 - 1, 31); RrdGraphDef rgdef = new RrdGraphDef(); // If the filename is set to '-' the image will be created only in // memory (no file will be created). // rgdef.setFilename("-"); rgdef.setFilename(rootPath + imgFileName); // "PNG", "GIF" or "JPG" rgdef.setImageFormat("PNG"); // rgdef.setTimeSpan(startTime, endTime); rgdef.setStartTime(startTime); rgdef.setEndTime(endTime); rgdef.setAntiAliasing(false); rgdef.setSmallFont(new Font("Monospaced", Font.PLAIN, 11)); rgdef.setLargeFont(new Font("SansSerif", Font.BOLD, 14)); rgdef.setTitle("JRobin graph by RrdGraphDef demo"); // default 400 rgdef.setWidth(500); // default 100 rgdef.setHeight(200); // 一般不需要设置这个参数 // rgdef.setStep(86400); rgdef.setVerticalLabel("transfer speed [bits/sec]"); rgdef.datasource("in", rootPath + "demo_flow.rrd", "input", "AVERAGE"); rgdef.datasource("out", rootPath + "demo_flow.rrd", "output", "AVERAGE"); rgdef.datasource("in8", "in,8,*"); rgdef.datasource("out8", "out,8,*"); // PS:先画域的再画线的,否则线会被域遮盖 rgdef.area("out8", new Color(0, 206, 0), "output traffic"); rgdef.line("in8", Color.BLUE, "input traffic\\l"); // \\l->左对齐 \\c->中间对齐 \\r->右对齐 \\j->自适应 // \\s-> \\g->glue \\J-> rgdef.gprint("in8", "MAX", "maxIn=%.2f %sbits/sec"); rgdef.gprint("out8", "MAX", "maxOut=%.2f %sbits/sec\\l"); rgdef.gprint("in8", "AVERAGE", "avgIn=%.2f %sbits/sec"); rgdef.gprint("out8", "AVERAGE", "avgOut=%.2f %sbits/sec\\l"); rgdef.gprint("in8", "TOTAL", "totalIn=%.2f %sbits/sec"); rgdef.gprint("out8", "TOTAL", "totalOut=%.2f %sbits/sec\\s"); rgdef.comment("画图测试"); RrdGraph graph = new RrdGraph(rgdef); System.out.println("[rrd graph info:]" + graph.getRrdGraphInfo().dump()); // 如果filename没有设置,只是在内存中,可以调用下面的方法再次生成图片文件 if ("-".equals(graph.getRrdGraphInfo().getFilename())) { createImgFile(graph, rootPath + imgFileName); } System.out.println("[rrd graph by RrdGraphDef success.]"); } catch (Exception e) { e.printStackTrace(); } } /** * ImageIO 生成图片文件 */ private void createImgFile(RrdGraph graph, String imgFileFullName) { try { BufferedImage image = new BufferedImage(graph.getRrdGraphInfo() .getWidth(), graph.getRrdGraphInfo().getHeight(), BufferedImage.TYPE_INT_RGB); graph.render(image.getGraphics()); File imgFile = new File(imgFileFullName); ImageIO.write(image, "PNG", imgFile); } catch (Exception e) { e.printStackTrace(); } } /** * 根据定义的XML模板生成图片 * @param rootPath * @param imgFileName */ private void graphByTemplate(String rootPath, String tempName) { try { System.out.println("[rrd graph by xml template start...]"); RrdGraphDefTemplate defTemplate = new RrdGraphDefTemplate( new InputSource(rootPath + tempName)); // setVariable 设置XML template的变量 defTemplate.setVariable("startTime", "20101001 00:00"); defTemplate.setVariable("endTime", "20101031 23:59"); defTemplate.setVariable("in_rrd_file", rootPath + "demo_flow.rrd"); defTemplate.setVariable("out_rrd_file", rootPath + "demo_flow.rrd"); RrdGraph graph = new RrdGraph(defTemplate.getRrdGraphDef()); BufferedImage image = new BufferedImage(graph.getRrdGraphInfo() .getWidth(), graph.getRrdGraphInfo().getHeight(), BufferedImage.TYPE_INT_RGB); graph.render(image.getGraphics()); File imgFile = new File(rootPath + "demo_graph_tmp.PNG"); ImageIO.write(image, "PNG", imgFile);// System.out.println("[rrd graph by xml template success.]"); } catch (Exception e) { e.printStackTrace(); } } }
${startTime} ${endTime} - off Monospaced 11 SansSerif 14 JRobin graph by xml template demo transfer speed [bits/sec] 500 200 1024 in ${in_rrd_file} AVERAGE out ${out_rrd_file} AVERAGE in #00ce00 out #0000FF in MAX 入速率最大值:%7.2f %sbits/sec out MAX 出速率最大值:%7.2f %sbits/sec\l in AVERAGE 入速率平均值:%7.2f %sbits/sec out AVERAGE 出速率平均值:%7.2f %sbits/sec\l in TOTAL 总入流量:%7.2f %sbits out TOTAL 总出流量:%7.2f %sbits\l 测试画图\l