本文通过示例代码指导您使用多值模型写入数据。详细示例请参见Aliyun TSDB SDK for Java中的test/example/ExampleOfMultiField和test/com.aliyun.hitsdb.client/TestHiTSDBClientMultiFieldFeatures

说明 多值模型仅在0.2.0版本及以上的SDK支持。关于最新SDK版本的说明及下载,请参见SDK的《版本说明》。之前版本的SDK所支持的多值模型实际是模拟多值模型,不鼓励继续使用。之前通过MultiValue 类写入的数据并不能通过最新的 SDK 多值模型相关类 (MultiField) 进行查询。

多值模型的数据写入

示例代码:

        /*
         *  通过 multiFieldPutSync() API。
         *  该 API 支持单点和多点(List)写入。
         *
         *  下面是必须写入时必须提供的信息:
         *  Metric: 数据指标的类别。相当于 influxdb 的 Measurement。
         *  Fields: 数据指标的度量信息(相当于指标下的子类别)。即一个 metric 支持多个 fields。如 metric 为 wind,该 metric 可以有多个 fields:direction, speed, direction, description 和 temperature。
         *  Timestamp: 数据点的时间戳
         *  Tags: 时间线额外的信息,如"型号=ABC123"、"出厂编号=1234567890"等。
         */
        MultiFieldPoint multiFieldPoint = MultiFieldPoint.metric("wind")
                .field("speed", 45.2)
                .field("level", 1.2)
                .field("direction", "S")
                .field("description", "Breeze")
                .tag("sensor", "95D8-7913")
                .tag("city", "hangzhou")
                .tag("province", "zhejiang")
                .timestamp(1537170208L)
                .build();

        // 同步写入
        tsdb.multiFieldPutSync(multiFieldPoint);

多值模型的异步写入

注意:多值模型异步仅在 0.2.1 版本及以上的 SDK 支持。关于最新 SDK 版本的说明及下载,请参见SDK的《版本说明》。

不使用回调方法

默认的TSDBConfig没有设置多值异步写入回调方法。示例代码:
TSDBConfig config = TSDBConfig.address("127.0.0.1", 8242)
                // 批次写入时每次提交数据量
                .batchPutSize(500)
                // 单值异步写入线程数
                .batchPutConsumerThreadCount(1)
                // 多值异步写入缓存队列长度
                .multiFieldBatchPutBufferSize(10000)
                // 多值异步写入线程数
                .multiFieldBatchPutConsumerThreadCount(1)
                .config();

        // 特别注意,TSDB只需初始化一次即可
        TSDB tsdb = TSDBClientFactory.connect(config);

        MultiFieldPoint point = MultiFieldPoint
                .metric("test-test-test")
                .tag("a", "1")
                .tag("b", "2")
                .timestamp(System.currentTimeMillis())
                .field("f1", Math.random())
                .field("f2", Math.random())
                .build();
        tsdb.multiFieldPut(point);

        // 特别注意,在应用生命周期内不用关闭TSDB实例,直到应用结束时关闭即可
        tsdb.close();
    }

使用普通回调方法

普通回调方法仅报告当写入成功时的数据点列表,或者当写入失败时的数据点列表以及对应的写入异常。示例代码:
      // 创建一个普通回调方法,用于处理写入成功或者失败后的情况
      AbstractMultiFieldBatchPutCallback callback = new MultiFieldBatchPutCallback() {

            @Override
            public void response(String address, List<MultiFieldPoint> points, Result result) {
                int count = num.addAndGet(points.size());
                System.out.println(result);
                System.out.println("已处理" + count + "个点");
            }
            final AtomicInteger num = new AtomicInteger();
            @Override
            public void failed(String address, List<MultiFieldPoint> points, Exception ex) {
                System.err.println("业务回调出错!" + points.size() + " error!");
                ex.printStackTrace();
            }
        };

       TSDBConfig config = TSDBConfig.address("127.0.0.1", 8242)
                .httpConnectTimeout(90)
                // 批次写入时每次提交数据量
                .batchPutSize(500)
                // 单值异步写入线程数
                .batchPutConsumerThreadCount(1)
                // 多值异步写入缓存队列长度
                .multiFieldBatchPutBufferSize(10000)
                // 多值异步写入线程数
                .multiFieldBatchPutConsumerThreadCount(1)
                // 多值异步写入回调方法
                .listenMultiFieldBatchPut(callback)
                .config();

        // 特别注意,TSDB只需初始化一次即可
        TSDB tsdb = TSDBClientFactory.connect(config);

        MultiFieldPoint point = MultiFieldPoint
                .metric("test-test-test")
                .tag("a", "1")
                .tag("b", "2")
                .timestamp(System.currentTimeMillis())
                .field("f1", Math.random())
                .field("f2", Math.random())
                .build();
        tsdb.multiFieldPut(point);

        // 特别注意,在应用生命周期内不用关闭TSDB实例,直到应用结束时关闭即可
        tsdb.close();
    }

使用摘要回调方法

摘要回调方法,当写入成功时,报告这次写入成功时的数据点列表,以及对应的写入摘要情况,包括成功点数,失败点数;当写入失败时,报告这次写入失败时的数据点列表以及对应的写入异常。示例代码:
      // 创建一个摘要回调方法,用于处理写入成功或者失败后的情况
      AbstractMultiFieldBatchPutCallback callback = new MultiFieldBatchPutSummaryCallback() {

            final AtomicInteger num = new AtomicInteger();
            @Override
            public void response(String address, List<MultiFieldPoint> points, SummaryResult result) {
                int count = num.addAndGet(points.size());
                System.out.println(result);
                System.out.println("已处理" + count + "个点");
            }



            @Override
            public void failed(String address, List<MultiFieldPoint> points, Exception ex) {
                System.err.println("业务回调出错!" + points.size() + " error!");
                ex.printStackTrace();
            }
        };

       TSDBConfig config = TSDBConfig.address("127.0.0.1", 8242)
                .httpConnectTimeout(90)
                // 批次写入时每次提交数据量
                .batchPutSize(500)
                // 单值异步写入线程数
                .batchPutConsumerThreadCount(1)
                // 多值异步写入缓存队列长度
                .multiFieldBatchPutBufferSize(10000)
                // 多值异步写入线程数
                .multiFieldBatchPutConsumerThreadCount(1)
                // 多值异步写入回调方法
                .listenMultiFieldBatchPut(callback)
                .config();

        // 特别注意,TSDB只需初始化一次即可
        TSDB tsdb = TSDBClientFactory.connect(config);

        MultiFieldPoint point = MultiFieldPoint
                .metric("test-test-test")
                .tag("a", "1")
                .tag("b", "2")
                .timestamp(System.currentTimeMillis())
                .field("f1", Math.random())
                .field("f2", Math.random())
                .build();
        tsdb.multiFieldPut(point);

        // 特别注意,在应用生命周期内不用关闭TSDB实例,直到应用结束时关闭即可
        tsdb.close();
    }

使用详情回调方法

详情回调方法,当写入成功时,报告这次写入成功时的数据点列表,以及对应的写入详情,包括写入失败的点以及对应错误信息等;当写入失败时,报告这次写入失败时的数据点列表以及对应的写入异常。示例代码:
      // 创建一个详情回调方法,用于处理写入成功或者失败后的情况
      MultiFieldBatchPutDetailsCallback callback = new MultiFieldBatchPutDetailsCallback() {

            final AtomicInteger num = new AtomicInteger();

            @Override
            public void response(String address, List<MultiFieldPoint> points, DetailsResult result) {
                int count = num.addAndGet(points.size());
                System.out.println(result);
                System.out.println("已处理" + count + "个点");
            }

            @Override
            public void failed(String address, List<MultiFieldPoint> points, Exception ex) {
                System.err.println("业务回调出错!" + points.size() + " error!");
                ex.printStackTrace();
            }
        };

       TSDBConfig config = TSDBConfig.address("127.0.0.1", 8242)
                .httpConnectTimeout(90)
                // 批次写入时每次提交数据量
                .batchPutSize(500)
                // 单值异步写入线程数
                .batchPutConsumerThreadCount(1)
                // 多值异步写入缓存队列长度
                .multiFieldBatchPutBufferSize(10000)
                // 多值异步写入线程数
                .multiFieldBatchPutConsumerThreadCount(1)
                // 多值异步写入回调方法
                .listenMultiFieldBatchPut(callback)
                .config();

        // 特别注意,TSDB只需初始化一次即可
        TSDB tsdb = TSDBClientFactory.connect(config);

        MultiFieldPoint point = MultiFieldPoint
                .metric("test-test-test")
                .tag("a", "1")
                .tag("b", "2")
                .timestamp(System.currentTimeMillis())
                .field("f1", Math.random())
                .field("f2", Math.random())
                .build();
        tsdb.multiFieldPut(point);

        // 特别注意,在应用生命周期内不用关闭TSDB实例,直到应用结束时关闭即可
        tsdb.close();
    }