自动配置类
@Configuration
@ConditionalOnProperty(prefix = "support.influxdb", value = "enabled", havingValue = "true")
public class InfluxDBConfig {
@Value("${support.influxdb.url}")
public String url;
@Value("${support.influxdb.userName}")
public String userName;
@Value("${support.influxdb.password}")
public String password;
@Value("${support.influxdb.database}")
public String database;
@Bean
public InfluxDB influxdb() {
InfluxDB influxDB = InfluxDBFactory.connect(url, userName, password);
influxDB.setDatabase(database)
.setLogLevel(InfluxDB.LogLevel.BASIC)
.enableBatch(1, 1000 * 60, TimeUnit.MILLISECONDS);
return influxDB;
}
}
数据写入
public void insert(String measurement, Map<String, String> tags, Map<String, Object> fields) {
insert(measurement, System.currentTimeMillis(), tags, fields);
}
public void insert(String measurement, long time, Map<String, String> tags, Map<String, Object> fields) {
Point.Builder builder = Point.measurement(measurement);
builder.time(time, TimeUnit.MILLISECONDS);
builder.tag(tags);
builder.fields(fields);
influxDB.write(builder.build());
}
public void insertBatchByRecords(List<Map<String, Object>> records) {
List<String> list = new ArrayList<>();
for (Map<String, Object> record : records) {
list.add(buildPoint(record).lineProtocol());
}
influxDB.write(list);
}
public void insertBatchByPoints(List<Map<String, Object>> records) {
BatchPoints batchPoints = BatchPoints.builder()
.consistency(InfluxDB.ConsistencyLevel.ALL)
.build();
for (Map<String, Object> record : records) {
batchPoints.point(buildPoint(record));
}
influxDB.write(batchPoints);
}
@SuppressWarnings("unchecked")
private Point buildPoint(Map<String, Object> record) {
Point.Builder builder = Point.measurement((String) record.get("measurement"));
builder.time((long) record.get("time"), TimeUnit.MILLISECONDS);
builder.tag((Map<String, String>) record.get("tags"));
builder.fields((Map<String, Object>) record.get("fields"));
return builder.build();
}
数据查询
public List<Map<String, Object>> queryRecords(String fieldKeys, String measurement) {
return processRecords("select " + fieldKeys + " from " + measurement);
}
public List<Map<String, Object>> queryRecords(String fieldKeys, String measurement, String order) {
return processRecords("select " + fieldKeys + " from " + measurement + " order by " + order);
}
public List<Map<String, Object>> queryRecords(String measurement, String devEUI, String beginTime, String endTime) {
String command = "select * from " + measurement + " where \"devEUI\" = '" + devEUI + "'";
if (StringUtils.isNotBlank(beginTime)) {
command += " and time >= '" + beginTime + "'";
}
if (StringUtils.isNotBlank(endTime)) {
command += " and time <= '" + endTime + "'";
}
command += " order by time desc";
return processRecords(command);
}
public List<Map<String, Object>> processRecords(String command) {
List<Map<String, Object>> list = new ArrayList<>();
QueryResult queryResult = influxDB.query(new Query(command));
List<QueryResult.Result> resultList = queryResult.getResults();
for (QueryResult.Result result : resultList) {
List<QueryResult.Series> seriesList = result.getSeries();
if (CollectionUtils.isNotEmpty(seriesList)) {
for (QueryResult.Series series : seriesList) {
List<String> columns = series.getColumns();
List<List<Object>> values = series.getValues();
if (CollectionUtils.isNotEmpty(values)) {
for (List<Object> value : values) {
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < columns.size(); i++) {
map.put(columns.get(i), value.get(i));
}
list.add(map);
}
}
}
}
}
return list;
}