Sample upate 方法的注意点

来源:互联网 发布:淘宝网修身连衣裙 编辑:程序博客网 时间:2024/06/15 01:58

    Sample.update()方法向rrd中更新(插入)数据,但是这个插入数据的时候会检查新插入数据的时间戳是否比上次数据的时间戳大,如果小的话就不允许。

   

 //创建rrd   RrdDef rrdDef = new RrdDef(rrdFile);       // rrdDef.addDatasource("value", DsType.DERIVE, 600, 0, Double.NaN);         rrdDef.addArchive(ConsolFun.AVERAGE,0.5,1,300);         rrdDef.addArchive(ConsolFun.MIN,0.5,12,300);         rrdDef.addArchive(ConsolFun.MAX,0.5,12,300);         rrdDef.addDatasource(new DsDef("value", DsType.DERIVE, 100000, 0, 1));         //RrdDb rrdDb = new RrdDb(rrdDef, factory);         RrdDb rrdDb = new RrdDb(rrdDef);         long end=0L;         long start=0L;         int i = 0;         while(cursor.hasNext()){            DBObject object = cursor.next();        System.out.println(object);             if(object.get("time")!=null){            Long time = (Long) object.get("time");       System.out.println(i+": "+time);            Double value = (Double) object.get("value");            Sample sample = rrdDb.createSample(time+1);            sample.setValue("value", value);System.out.println("time:"+time+"value:"+value);            sample.update();             if(i==0){                 start = time;             }             i++;         }         }         rrdDb.close();
上面创建RrdDef的时候,如果没有加入起始时间戳,后面update的时候插入第一条数据的时候就把当前时间作为上一次的时间戳,这往往比新插入的时间戳大,因此不允许。会报错:

Exception in thread "main" java.lang.IllegalArgumentException: Bad sample time: 1341991059. Last update time was 1342000665, at least one second step is required
at org.rrd4j.core.RrdDb.store(RrdDb.java:553)
at org.rrd4j.core.Sample.update(Sample.java:197)
at com.chinanetcenter.practise.RRD4JDraw.main(RRD4JDraw.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)

在创建RrdDef的时候:

 RrdDef rrdDef = new RrdDef(rrdFile,1341991058L,100000L);
就是要传入真正的第一条数据的时间戳,这样才不会出现问题


原创粉丝点击