Sample upate 方法的注意点

本文介绍使用 RRD4J 更新数据时遇到的时间戳问题及解决方案。通过正确设置 RrdDef 的起始时间戳避免因默认使用当前时间而导致无法更新历史数据的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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);
就是要传入真正的第一条数据的时间戳,这样才不会出现问题



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值