influxdb-java:org.influxdb.InfluxDBIOException:java.net.SocketException:对等重置连接:套接字写入错误

时间:2019-04-25 14:28:57

标签: java influxdb

我正在测试InfluxDB以存储传感器时间序列。我正在使用influxdb-java客户端库(版本2.15),并且出于测试目的在本地运行InfluxDB 1.7.6。

我所有的点都存储了.csv文件(每个传感器一个),这些文件本身也存储在.zip文件中(每个数据集一个)。我的代码遍历每个csv文件的每一行。点以批处理模式编写。

/**
 * Get the connection to the database
 */
InfluxDB influxDB = InfluxDBFactory.connect("http://192.168.51.51:8086");
influxDB.query(new Query("CREATE DATABASE theia_in_situ"));
influxDB.setDatabase("theia_in_situ");
influxDB.enableBatch();
influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
/**
 * Create batch point to write each measure of the time serie more efficiently
 */
BatchPoints batchPoints = BatchPoints
        .database("theia_in_situ")
        .build();

对于每个CSV数据文件,执行以下方法:

public static void createAndImportTimeSeriesDocuments(InputStream txtFileIn, String observationId, String producerId,
        InfluxDB influxDB, BatchPoints batchPoints) throws IOException, ParseException {
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
    /**
     * Store the variable name
     */
    String observedProperty = null;
    try (BufferedReader br = new BufferedReader(new InputStreamReader(txtFileIn));) {
        String line = null;
        /**
         * Read the headers
         */
        while ((line = br.readLine()).substring(0, 1).equals("#")) {
            if (line.substring(0, 15).equals("#Variable_name;")) {
                observedProperty = line.split(";")[1];
            }
        }
        /**
         * Read the data
         */
        while ((line = br.readLine()) != null) {
            String[] lineSplitted = line.split(";", -1);
            Point point = Point.measurement(observedProperty)
                    .tag("producerId", producerId)
                    .tag("observationId", observationId)
                    .time(df.parse(lineSplitted[1]).getTime(), TimeUnit.MILLISECONDS)
                    .addField("value", lineSplitted[5])
                    .addField("flag", lineSplitted[6])
                    .build();
            batchPoints.point(point);
        }
        influxDB.write(batchPoints);
    }
}

我可以写一个或几个测量值,但是很快我得到了以下异常:

  

线程“主”中的异常org.influxdb.InfluxDBIOException:java.net.SocketException:对等重置连接:套接字写入错误       在org.influxdb.impl.InfluxDBImpl.execute(InfluxDBImpl.java:812)       在org.influxdb.impl.InfluxDBImpl.write(InfluxDBImpl.java:463)

我已经禁用了here中提到的max-concurrent-write-limit,max-enqueued-write-limit,enqueued-write-timeout(在/etc/influxdb/influxdb.conf中将每个值设置为0)。 即使在Github页面中将此问题作为FAQ提及,我也找不到任何重现我问题的问题。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试以批处理方式写入BatchPoint时似乎发生此异常。

  

influxdb-java客户端将您的写操作存储到内部   缓冲并以固定刷新异步将其刷新到InfluxDB   间隔,以在客户端和服务器端均获得良好的性能。

这是更新的代码。

/**
 * Read the data
 */
while ((line = br.readLine()) != null) {
    String[] lineSplitted = line.split(";", -1);
    Point point = Point.measurement(observedProperty)
            .tag("producerId", producerId)
            .tag("observationId", observationId)
            .time(df.parse(lineSplitted[1]).getTime(), TimeUnit.MILLISECONDS)
            .addField("value", lineSplitted[5])
            .addField("flag", lineSplitted[6])
            .build();
    influxDB.write(point);
  //  batchPoints.point(point);
}
//influxDB.write(batchPoints);