From 47567ff0554c100ff0de0e77e768609fa39b909b Mon Sep 17 00:00:00 2001 From: xinzirun Date: Sun, 29 Sep 2024 00:55:53 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat():=20=E6=96=B0=E5=A2=9EIoTDB=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=B1=BB=E3=80=81=E5=9F=BA=E7=A1=80=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-auth/src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/bootstrap.yml | 2 +- .../cloud-modules-data-process/pom.xml | 91 +++ .../process/CloudDataProcessApplication.java | 20 + .../basic/config/IoTDBSessionConfig.java | 72 ++ .../process/basic/service/IoTDBService.java | 110 +++ .../basic/service/impl/IoTDBServiceImpl.java | 714 ++++++++++++++++++ .../muyu/data/process/domain/DataJSON.java | 33 + .../data/process/domain/InsertDataDTO.java | 67 ++ .../data/process/domain/ResultEntity.java | 36 + .../data/process/domain/TestDataType.java | 43 ++ .../process/domain/dto/IoTDbRecordAble.java | 12 + .../dto/MeasurementSchemaValuesDTO.java | 36 + .../src/main/resources/banner.txt | 2 + .../src/main/resources/bootstrap.yml | 45 ++ .../src/main/resources/logback/dev.xml | 74 ++ .../src/main/resources/logback/prod.xml | 81 ++ .../src/main/resources/logback/test.xml | 81 ++ .../cloud-modules-enterprise-server/pom.xml | 1 - .../CloudEnterpriseApplication.java | 2 +- .../src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/bootstrap.yml | 2 +- cloud-modules/pom.xml | 1 + .../src/main/resources/bootstrap.yml | 2 +- pom.xml | 8 + 27 files changed, 1534 insertions(+), 9 deletions(-) create mode 100644 cloud-modules/cloud-modules-data-process/pom.xml create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java create mode 100644 cloud-modules/cloud-modules-data-process/src/main/resources/banner.txt create mode 100644 cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml create mode 100644 cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml create mode 100644 cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml create mode 100644 cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml diff --git a/cloud-auth/src/main/resources/bootstrap.yml b/cloud-auth/src/main/resources/bootstrap.yml index 2bdda14..270c8d6 100644 --- a/cloud-auth/src/main/resources/bootstrap.yml +++ b/cloud-auth/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr # Spring spring: application: diff --git a/cloud-gateway/src/main/resources/bootstrap.yml b/cloud-gateway/src/main/resources/bootstrap.yml index 4132cf0..5e54e71 100644 --- a/cloud-gateway/src/main/resources/bootstrap.yml +++ b/cloud-gateway/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr # Spring spring: diff --git a/cloud-modules/cloud-modules-data-process/pom.xml b/cloud-modules/cloud-modules-data-process/pom.xml new file mode 100644 index 0000000..cb4a354 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + com.muyu + cloud-modules + 3.6.3 + + + cloud-modules-data-process + + + 17 + 17 + UTF-8 + + + + cloud-modules-data-process 数据处理 + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.mysql + mysql-connector-j + + + + + com.muyu + cloud-common-datasource + + + + + com.muyu + cloud-common-datascope + + + + + com.muyu + cloud-common-log + + + + + com.muyu + cloud-common-api-doc + + + + + com.muyu + cloud-common-core + + + + + org.apache.iotdb + iotdb-session + + + \ No newline at end of file diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java new file mode 100644 index 0000000..b5ba238 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java @@ -0,0 +1,20 @@ +package com.muyu.data.process; + +import com.muyu.common.security.annotation.EnableCustomConfig; +import com.muyu.common.security.annotation.EnableMyFeignClients; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Author: zi run + * @Date 2024/9/28 22:31 + * @Description 数据处理微服启动类 + */ +@EnableCustomConfig +@EnableMyFeignClients +@SpringBootApplication +public class CloudDataProcessApplication { + public static void main(String[] args) { + SpringApplication.run(CloudDataProcessApplication.class, args); + } +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java new file mode 100644 index 0000000..3bf7de1 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java @@ -0,0 +1,72 @@ +package com.muyu.data.process.basic.config; + +import lombok.extern.slf4j.Slf4j; +import org.apache.iotdb.session.pool.SessionPool; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import java.util.List; + +/** + * @Author: zi run + * @Date 2024/9/28 22:41 + * @Description IoTDB会话配置 + */ +@Slf4j +@Component +@Configuration +public class IoTDBSessionConfig { + + @Value("${spring.iotdb.username}") + private String username; + + @Value("${spring.iotdb.password}") + private String password; + + @Value("${spring.iotdb.ip}") + private String ip; + + @Value("${spring.iotdb.port}") + private int port; + + @Value("${spring.iotdb.maxSize}") + private int maxSize; + + /** + * IoTDB会话池 + */ + private static SessionPool sessionPool = null; + + /** + * 获取IoTDB会话对象 + * @return ioTDB会话对象 + */ + public SessionPool getSessionPool() { + if (sessionPool == null) { + sessionPool = new SessionPool(ip, port, username, password, maxSize); + } + return sessionPool; + } + + /** + * 向IoTDB中插入特定设备的记录 + * + * @param deviceId 设备的唯一标识符 + * @param time 记录的时间戳,以毫秒为单位 + * @param measurements 与记录关联的测量名称列表 + * @param values 每个测量对应的值列表。值的顺序必须与测量名称一一对应 + * + *

该方法从会话池中获取一个会话,并尝试将指定的记录插入到 IoTDB 中。 + * 如果插入失败,将记录错误信息,便于后续排查。

+ */ + public void insertRecord(String deviceId, long time, List measurements, List values) { + getSessionPool(); + try { + log.info("iotdb数据入库:device_id:[{}], measurements:[{}], values:[{}]", deviceId, measurements, values); + sessionPool.insertRecord(deviceId, time, measurements, values); + } catch (Exception e) { + log.error("IotDBSession insertRecord失败: deviceId={}, time={}, measurements={}, values={}, error={}", + deviceId, time, measurements, values, e.getMessage()); + } + } +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java new file mode 100644 index 0000000..0a99fd6 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java @@ -0,0 +1,110 @@ +package com.muyu.data.process.basic.service; + +import com.muyu.data.process.domain.dto.IoTDbRecordAble; +import com.muyu.data.process.domain.dto.MeasurementSchemaValuesDTO; +import org.apache.iotdb.common.rpc.thrift.TAggregationType; +import org.apache.iotdb.isession.SessionDataSet; +import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; +import org.apache.iotdb.tsfile.write.record.Tablet; +import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; + +import java.util.List; +import java.util.Map; + +/** + * @Author: zi run + * @Date 2024/9/28 23:37 + * @Description IoTDB业务层 + */ +public interface IoTDBService { + + /** + * 插入一个 Tablet 对象到 IoTDB 数据库 + * + * @param tablet 要插入的 Tablet 对象,包含待写入的数据 + */ + void insertTablet(Tablet tablet); + + void insertTablets(Map tablets); + + void insertStringRecord(String deviceId, long time, List measurements, List values); + + void insertRecord(String deviceId, long time, List measurements, List types, List values); + + void insertStringRecords(List deviceIds, List times, List> measurementsList, List> valuesList); + + void insertRecords(List deviceIds, List times, List> measurementsList, List> typesList, List> valuesList); + + void insertStringRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> valuesList); + + void insertRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> typesList, List> valuesList); + + void deleteData(String path, long endTime); + + void deleteData(List paths, long endTime); + + SessionDataSet executeRawDataQuery(List paths, long startTime, long endTime, long timeOut); + + List executeRawDataQuery(List paths, long startTime, long endTime, long timeOut, Class clazz); + + SessionDataSet executeLastDataQuery(List paths, long lastTime); + + List executeLastDataQuery(List paths, long lastTime, Class clazz); + + SessionDataSet executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes); + + List executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes, Class clazz); + + SessionDataSet executeAggregationQuery(List paths, List aggregations); + + SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime); + + SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval); + + SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval, long slidingStep); + + SessionDataSet executeQueryStatement(String sql); + + + /** + * SQL非查询 + * + * @param sql + */ + void executeNonQueryStatement(String sql); + + /** + * 封装处理数据 + * + * @param sessionDataSet + * @param columnNames + */ + List> packagingMapData(SessionDataSet sessionDataSet, List columnNames); + + /** + * 封装处理数据(不支持聚合查询) + * + * @param sessionDataSet 查询返回的结果集 + * @param titleList 查询返回的结果集内的字段名 + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @param + * @return + */ + List packagingObjectData(SessionDataSet sessionDataSet, List titleList, Class clazz); + + /** + * 根据对象构建MeasurementSchemas + * + * @param object 对象 + * @return + */ + List buildMeasurementSchemas(Object object); + + /** + * 根据对象构建MeasurementSchemaValuesDTO + * + * @param object 对象 + * @return + */ + MeasurementSchemaValuesDTO buildMeasurementSchemasAndValues(Object object); +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java new file mode 100644 index 0000000..d551a1a --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java @@ -0,0 +1,714 @@ +package com.muyu.data.process.basic.service.impl; + +import com.alibaba.fastjson.JSON; +import com.muyu.data.process.basic.config.IoTDBSessionConfig; +import com.muyu.data.process.basic.service.IoTDBService; +import com.muyu.data.process.domain.dto.IoTDbRecordAble; +import com.muyu.data.process.domain.dto.MeasurementSchemaValuesDTO; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.iotdb.common.rpc.thrift.TAggregationType; +import org.apache.iotdb.isession.pool.SessionDataSetWrapper; +import org.apache.iotdb.session.pool.SessionPool; +import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; +import org.apache.iotdb.tsfile.read.common.Field; +import org.apache.iotdb.tsfile.read.common.RowRecord; +import org.apache.iotdb.tsfile.write.record.Tablet; +import org.apache.iotdb.isession.SessionDataSet; +import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; +import org.springframework.stereotype.Service; + +import java.lang.reflect.Type; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: zi run + * @Date 2024/9/28 23:38 + * @Description IoTDB业务实现层 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class IoTDBServiceImpl implements IoTDBService { + + /** + * IoTDB会话配置 + */ + private final IoTDBSessionConfig ioTDBSessionConfig; + + /** + * 插入一个 Tablet 对象到 IoTDB 数据库 + * + * @param tablet 要插入的 Tablet 对象,包含待写入的数据 + */ + @Override + public void insertTablet(Tablet tablet) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:tablet:[{}]", tablet); + sessionPool.insertTablet(tablet); + } catch (Exception e) { + log.error("IotDBSession insertTablet失败: tablet={}, error={}", tablet, e.getMessage()); + } + } + + /** + * 将给定的 Tablets 插入到 IoTDB 数据库中。 + * + * @param tablets 一个 Map,包含要插入的 Tablets,键为 String 类型,值为 Tablet 对象。 + * Tablets 应该已经准备好并符合 IoTDB 的插入要求。 + */ + @Override + public void insertTablets(Map tablets) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:tablets:[{}]", tablets); + sessionPool.insertTablets(tablets); + } catch (Exception e) { + log.error("IotDBSession insertTablets失败: tablets={}, error={}", tablets, e.getMessage()); + } + } + + /** + * 单条数据插入(string类型数据项) + * + * @param deviceId 设备名(表名)root.ln.wf01.wt01 + * @param time 时间戳 + * @param measurements 数据项列表 + * @param values 数据项对应值列表 + */ + @Override + public void insertStringRecord(String deviceId, long time, List measurements, List values) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:device_id:[{}], measurements:[{}], values:[{}]", deviceId, measurements, values); + sessionPool.insertRecord(deviceId, time, measurements, values); + } catch (Exception e) { + log.error("IotDBSession insertRecord失败: deviceId={}, time={}, measurements={}, values={}, error={}", + deviceId, time, measurements, values, e.getMessage()); + } + } + + /** + * 单条数据插入(不同类型数据项) + * + * @param deviceId 设备名(表名)root.ln.wf01.wt01 + * @param time 时间戳 + * @param measurements 数据项列表 + * @param types 数据项对应类型列表 + * @param values 数据项对应值列表 + */ + @Override + public void insertRecord(String deviceId, long time, List measurements, List types, List values) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:device_id:[{}], measurements:[{}], types:[{}], values:[{}]", deviceId, measurements, types, values); + sessionPool.insertRecord(deviceId, time, measurements, types, values); + } catch (Exception e) { + log.error("IotDBSession insertRecordHasTypes失败: deviceId={}, time={}, measurements={},types={}, values={}, error={}", + deviceId, time, measurements, types, values, e.getMessage()); + } + } + + + /** + * 多个设备多条数据插入(string类型数据项) + * + * @param deviceIds 多个设备名(表名)root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + @Override + public void insertStringRecords(List deviceIds, List times, List> measurementsList, List> valuesList) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:deviceIds:[{}], measurementsList:[{}], valuesList:[{}]", deviceIds, measurementsList, valuesList); + sessionPool.insertRecords(deviceIds, times, measurementsList, valuesList); + } catch (Exception e) { + log.error("IotDBSession insertRecords失败: deviceIds={}, times={}, measurementsList={}, valuesList={}, error={}", + deviceIds, times, measurementsList, valuesList, e.getMessage()); + } + } + + /** + * 多个设备多条数据插入(不同类型数据项) + * + * @param deviceIds 多个设备名(表名))root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param typesList 数据项对应类型列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + @Override + public void insertRecords(List deviceIds, List times, List> measurementsList, List> typesList, List> valuesList) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:deviceIds:[{}], measurementsList:[{}], typesList:[{}], valuesList:[{}]", deviceIds, measurementsList, typesList, valuesList); + sessionPool.insertRecords(deviceIds, times, measurementsList, typesList, valuesList); + } catch (Exception e) { + log.error("IotDBSession insertRecords失败: deviceIds={}, times={}, measurementsList={}, typesList=[],valuesList={}, error={}", + deviceIds, times, measurementsList, typesList, valuesList, e.getMessage()); + } + } + + /** + * 单个设备多条数据插入(string类型数据项) + * + * @param deviceId 单个设备名(表名))root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + @Override + public void insertStringRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> valuesList) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:deviceId:[{}], measurementsList:[{}], valuesList:[{}]", deviceId, measurementsList, valuesList); + sessionPool.insertStringRecordsOfOneDevice(deviceId, times, measurementsList, valuesList); + } catch (Exception e) { + log.error("IotDBSession insertStringRecordsOfOneDevice失败: deviceId={}, times={}, measurementsList={}, valuesList={}, error={}", + deviceId, times, measurementsList, valuesList, e.getMessage()); + } + } + + /** + * 单个设备多条数据插入(不同类型数据项) + * + * @param deviceId 单个设备名(表名))root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param typesList 数据项对应类型列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + @Override + public void insertRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> typesList, List> valuesList) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据入库:deviceId:[{}], measurementsList:[{}], typesList:[{}], valuesList:[{}]", deviceId, measurementsList, typesList, valuesList); + sessionPool.insertRecordsOfOneDevice(deviceId, times, measurementsList, typesList, valuesList); + } catch (Exception e) { + log.error("IotDBSession insertRecordsOfOneDevice失败: deviceId={}, times={}, measurementsList={}, typesList=[],valuesList={}, error={}", deviceId, times, measurementsList, typesList, valuesList, e.getMessage()); + } + } + + /** + * 删除数据(删除一个时间序列在某个时间点前或这个时间点的数据) + * + * @param path 单个字段 root.ln.wf01.wt01.temperature + * @param endTime 删除时间点 + */ + @Override + public void deleteData(String path, long endTime) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据删除:path:[{}], endTime:[{}]", path, endTime); + sessionPool.deleteData(path, endTime); + } catch (Exception e) { + log.error("IotDBSession deleteData失败: deviceId={}, times={},error={}", path, endTime, e.getMessage()); + } + } + + /** + * 删除数据(删除多个时间序列在某个时间点前或这个时间点的数据) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param endTime 删除时间点 + */ + @Override + public void deleteData(List paths, long endTime) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb数据删除:paths:[{}], endTime:[{}]", paths, endTime); + sessionPool.deleteData(paths, endTime); + } catch (Exception e) { + log.error("IotDBSession deleteData失败: paths={}, times={},error={}", paths, endTime, e.getMessage()); + } + } + + /** + * 数据查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param outTime 超时时间 + * @return SessionDataSet (Time,paths) + */ + @Override + public SessionDataSet executeRawDataQuery(List paths, long startTime, long endTime, long outTime) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + try { + log.info("iotdb数据查询:paths:[{}], startTime:[{}], endTime:[{}],outTime:[{}]", paths, startTime, endTime, outTime); + sessionDataSetWrapper = sessionPool.executeRawDataQuery(paths, startTime, endTime, outTime); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeRawDataQuery失败: paths={}, startTime:[{}], endTime:[{}],outTime:[{}],error={}", paths, startTime, endTime, outTime, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * 数据查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param outTime 超时时间 + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @param + * @return + */ + @Override + public List executeRawDataQuery(List paths, long startTime, long endTime, long outTime, Class clazz) { + SessionDataSet sessionDataSet = executeRawDataQuery(paths, startTime, endTime, outTime); + List columnNames = sessionDataSet.getColumnNames(); + List resultEntities = null; + try { + resultEntities = packagingObjectData(sessionDataSet, columnNames, clazz); + } catch (Exception e) { + log.error("IotDBSession executeRawDataQuery失败: paths={}, startTime:[{}], endTime:[{}],outTime:[{}],error={}", paths, startTime, endTime, outTime, e.getMessage()); + } + return resultEntities; + } + + /** + * 最新点查询(查询最后一条时间戳大于等于某个时间点的数据) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param lastTime 结束时间 + * @return SessionDataSet + */ + @Override + public SessionDataSet executeLastDataQuery(List paths, long lastTime) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + try { + log.info("iotdb数据查询:paths:[{}], lastTime:[{}]", paths, lastTime); + sessionDataSetWrapper = sessionPool.executeLastDataQuery(paths, lastTime); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeLastDataQuery失败: paths={}, lastTime:[{}], error={}", paths, lastTime, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * 最新点查询(查询最后一条时间戳大于等于某个时间点的数据) + * + * @param + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param lastTime 结束时间 + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @return + */ + @Override + public List executeLastDataQuery(List paths, long lastTime, Class clazz) { + SessionDataSet sessionDataSet = executeLastDataQuery(paths, lastTime); + List columnNames = sessionDataSet.getColumnNames(); + List resultEntities = null; + try { + resultEntities = packagingObjectData(sessionDataSet, columnNames, clazz); + } catch (Exception e) { + log.error("IotDBSession executeLastDataQuery失败: paths={}, lastTime:[{}], error={}", paths, lastTime, e.getMessage()); + } + return resultEntities; + } + + /** + * 最新点查询(快速查询单设备下指定序列最新点) + * + * @param db root.ln.wf01 + * @param device root.ln.wf01.wt01 + * @param sensors temperature,status(字段名) + * @param isLegalPathNodes true(避免路径校验) + * @return SessionDataSet + */ + @Override + public SessionDataSet executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + try { + log.info("iotdb数据查询:db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}]", db, device, sensors, isLegalPathNodes); + sessionDataSetWrapper = sessionPool.executeLastDataQueryForOneDevice(db, device, sensors, isLegalPathNodes); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeLastDataQueryForOneDevice失败: db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}], error={}", db, device, sensors, isLegalPathNodes, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * @param db root.ln.wf01 + * @param device root.ln.wf01.wt01 + * @param sensors temperature,status(字段名) + * @param isLegalPathNodes true(避免路径校验) + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @param + * @return + */ + @Override + public List executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes, Class clazz) { + SessionDataSet sessionDataSet = executeLastDataQueryForOneDevice(db, device, sensors, isLegalPathNodes); + List columnNames = sessionDataSet.getColumnNames(); + List resultEntities = null; + try { + resultEntities = packagingObjectData(sessionDataSet, columnNames, clazz); + } catch (Exception e) { + log.error("IotDBSession executeLastDataQueryForOneDevice失败: db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}], error={}", db, device, sensors, isLegalPathNodes, e.getMessage()); + } + return resultEntities; + } + + /** + * 聚合查询 + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @return SessionDataSet + */ + @Override + public SessionDataSet executeAggregationQuery(List paths, List aggregations) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + try { + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}]", paths, aggregations); + sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,error={}", paths, aggregations, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * 聚合查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @param startTime 开始时间(包含) + * @param endTime 结束时间 + * @return SessionDataSet + */ + @Override + public SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + try { + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}]", paths, aggregations, startTime, endTime); + sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,startTime:[{}], endTime:[{}],error={}", paths, aggregations, startTime, endTime, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * 聚合查询(支持按照时间区间分段查询) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @param startTime 开始时间(包含) + * @param endTime 结束时间 + * @param interval + * @return SessionDataSet + */ + @Override + public SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + try { + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}] ,interval:[{}]", paths, aggregations, startTime, endTime, interval); + sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime, interval); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,startTime:[{}], endTime:[{}], interval:[{}], error={}", paths, aggregations, startTime, endTime, interval, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * 聚合查询(支持按照时间区间分段查询) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @param startTime 开始时间(包含) + * @param endTime 结束时间 + * @param interval + * @param slidingStep + * @return SessionDataSet + */ + @Override + public SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval, long slidingStep) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + + try { + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}] ,interval:[{}], slidingStep:[{}]", paths, aggregations, startTime, endTime, interval, slidingStep); + sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime, interval, slidingStep); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,startTime:[{}], endTime:[{}], interval:[{}], slidingStep:[{}] ,error={}", paths, aggregations, startTime, endTime, interval, slidingStep, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * SQL查询 + * + * @param sql + * @return + */ + @Override + public SessionDataSet executeQueryStatement(String sql) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + SessionDataSetWrapper sessionDataSetWrapper = null; + + try { + log.info("iotdb SQL查询:sql:[{}]", sql); + sessionDataSetWrapper = sessionPool.executeQueryStatement(sql); + return sessionDataSetWrapper.getSessionDataSet(); + } catch (Exception e) { + log.error("IotDBSession executeQueryStatement失败:sql:[{}],error={}", sql, e.getMessage()); + } finally { + sessionPool.closeResultSet(sessionDataSetWrapper); + } + return null; + } + + /** + * SQL非查询 + * + * @param sql + */ + @Override + public void executeNonQueryStatement(String sql) { + SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); + try { + log.info("iotdb SQL无查询:sql:[{}]", sql); + sessionPool.executeNonQueryStatement(sql); + } catch (Exception e) { + log.error("IotDBSession executeNonQueryStatement失败:sql:[{}],error={}", sql, e.getMessage()); + } + } + + /** + * 封装处理数据 + * + * @param sessionDataSet + * @param titleList + */ + @SneakyThrows + @Override + public List> packagingMapData(SessionDataSet sessionDataSet, List titleList) { + int fetchSize = sessionDataSet.getFetchSize(); + List> resultList = new ArrayList<>(); + titleList.remove("Time"); + if (fetchSize > 0) { + while (sessionDataSet.hasNext()) { + Map resultMap = new HashMap<>(); + RowRecord next = sessionDataSet.next(); + List fields = next.getFields(); + String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp()); + resultMap.put("time", timeString); + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + if (field.getDataType() == null || field.getObjectValue(field.getDataType()) == null) { + resultMap.put(splitString(titleList.get(i)), null); + } else { + resultMap.put(splitString(titleList.get(i)), field.getObjectValue(field.getDataType()).toString()); + } + } + resultList.add(resultMap); + } + } + return resultList; + } + + /** + * 封装处理数据(不支持聚合查询) + * + * @param sessionDataSet 查询返回的结果集 + * @param titleList 查询返回的结果集内的字段名 + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @param + * @return + */ + @SneakyThrows + @Override + public List packagingObjectData(SessionDataSet sessionDataSet, List titleList, Class clazz) { + int fetchSize = sessionDataSet.getFetchSize(); + List resultList = new ArrayList<>(); + titleList.remove("Time"); + if (fetchSize > 0) { + while (sessionDataSet.hasNext()) { + Map resultMap = new HashMap<>(); + RowRecord next = sessionDataSet.next(); + List fields = next.getFields(); + String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp()); + resultMap.put("time", timeString); + if (titleList.stream().anyMatch(str -> str.contains("."))) { + for (int i = 0; i < fields.size(); i++) { + Field field = fields.get(i); + String title = titleList.get(i); + if (field.getDataType() == null || field.getObjectValue(field.getDataType()) == null) { + resultMap.put(splitString(title), null); + } else { + resultMap.put(splitString(title), field.getObjectValue(field.getDataType()).toString()); + } + } + } else { + Field fieldName = fields.get(0); + Field fieldValue = fields.get(1); + Field fieldDataType = fields.get(2); + if (fieldName.getDataType() != null && fieldName.getObjectValue(fieldName.getDataType()) != null) { + String mapKey = fieldName.getObjectValue(fieldName.getDataType()).toString(); + Object mapValue = convertStringToType(fieldValue.getObjectValue(fieldValue.getDataType()).toString(), fieldDataType.getObjectValue(fieldDataType.getDataType()).toString()); + resultMap.put(splitString(mapKey), mapValue); + } + } + + String jsonString = JSON.toJSONString(resultMap); + resultList.add(JSON.parseObject(jsonString, (Type) clazz)); + } + } + return resultList; + } + + /** + * 分割获取字段名 + * + * @param str + * @return 字段名 + */ + public static String splitString(String str) { + String[] parts = str.split("\\."); + if (parts.length <= 0) { + return str; + } else { + return parts[parts.length - 1]; + } + } + + /** + * 根据数据值和数据类型返回对应数据类型数据 + * + * @param value 数据值 + * @param typeName 数据类型 + * @return 转换后的数据值 + */ + public static Object convertStringToType(String value, String typeName) { + String type = typeName.toLowerCase(); + if (type.isEmpty()) { + return value; + } + if ("boolean".equals(type)) { + return Boolean.parseBoolean(value); + } else if ("double".equals(type)) { + return Double.parseDouble(value); + } else if ("int32".equals(type)) { + return Integer.parseInt(value); + } else if ("int64".equals(type)) { + return Long.parseLong(value); + } else if ("float".equals(type)) { + return Float.parseFloat(value); + } else if ("text".equals(type)) { + return value; + } else { + return value; + } + } + + /** + * 根据对象属性的数据类型返回对应的TSDataType + * + * @param type 属性的数据类型 + * @return TSDataType + */ + public static TSDataType getTsDataTypeByString(String type) { + String typeName = splitString(type).toLowerCase(); + if ("boolean".equals(typeName)) { + return TSDataType.BOOLEAN; + } else if ("double".equals(typeName)) { + return TSDataType.DOUBLE; + } else if ("int".equals(typeName) || "integer".equals(typeName)) { + return TSDataType.INT32; + } else if ("long".equals(typeName)) { + return TSDataType.INT64; + } else if ("float".equals(typeName)) { + return TSDataType.FLOAT; + } else if ("text".equals(typeName)) { + return TSDataType.TEXT; + } else if ("string".equals(typeName)) { + return TSDataType.TEXT; + } else { + return TSDataType.UNKNOWN; + } + } + + /** + * 根据对象构建MeasurementSchemas + * + * @param obj 对象 + * @return + */ + @Override + public List buildMeasurementSchemas(Object obj) { + java.lang.reflect.Field[] fields = obj.getClass().getDeclaredFields(); + List schemaList = Arrays.stream(fields).map(field -> + new MeasurementSchema(field.getName(), + getTsDataTypeByString( + field.getType().getName() + ))). + collect(Collectors.toList()); + return schemaList; + } + + /** + * 根据对象构建MeasurementSchemaValuesDTO + * + * @param obj 对象 + * @return + */ + @SneakyThrows + @Override + public MeasurementSchemaValuesDTO buildMeasurementSchemasAndValues(Object obj) { + MeasurementSchemaValuesDTO measurementSchemaValuesDTO = new MeasurementSchemaValuesDTO(); + java.lang.reflect.Field[] fields = obj.getClass().getDeclaredFields(); + List schemaList = new ArrayList<>(); + List values = new ArrayList<>(); + List valuesIsNullIndex = new ArrayList<>(); + int valueIndex = 0; + for (java.lang.reflect.Field field : fields) { + MeasurementSchema measurementSchema = new MeasurementSchema(field.getName(), getTsDataTypeByString(field.getType().getName())); + schemaList.add(measurementSchema); + Object value = field.get(obj); + if (value == null) { + valuesIsNullIndex.add(valueIndex); + } + values.add(value); + valueIndex++; + } + measurementSchemaValuesDTO.setSchemaList(schemaList); + measurementSchemaValuesDTO.setValues(values); + return measurementSchemaValuesDTO; + } +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java new file mode 100644 index 0000000..86c075e --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java @@ -0,0 +1,33 @@ +package com.muyu.data.process.domain; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @Author: zi run + * @Date 2024/9/29 0:11 + * @Description JSON数据对象 + */ +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +@Tag(name = "ionDB数据源对象") +public class DataJSON { + + /** + * 时间戳 + */ + @Schema(name = "时间戳") + private Long timestamp; + + /** + * 车辆JSON数据 + */ + @Schema(name = "车辆JSON数据") + private String datasource; +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java new file mode 100644 index 0000000..91d5808 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java @@ -0,0 +1,67 @@ +package com.muyu.data.process.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: zi run + * @Date 2024/9/29 0:12 + * @Description 插入数据 数据转换对象 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class InsertDataDTO { + + /** + * 温度值 + */ + private Float temperature; + + /** + * 硬件标识 + */ + private String hardware; + + /** + * 状态标识 + */ + private Boolean status; + + /** + * 创建一个单一的InsertDataDTO实例,并设置默认值。 + * + * @return 一个配置好的InsertDataDTO对象 + */ + public InsertDataDTO buildOne() { + InsertDataDTO insertDataDTO = new InsertDataDTO(); + insertDataDTO.setHardware("ss"); + insertDataDTO.setStatus(true); + insertDataDTO.setTemperature(12.0F); + return insertDataDTO; + } + + /** + * 创建一个单一的InsertDataDTO实例,并设置默认值。 + * + * @return 一个配置好的InsertDataDTO对象 + */ + public List buildList() { + List insertDataDTOS = new ArrayList<>(); + int buildNum = 10; + for (int i = 0; i < buildNum; i++) { + InsertDataDTO insertDataDTO = new InsertDataDTO(); + insertDataDTO.setHardware(i % 2 == 0 ? "pp" + i : null); + insertDataDTO.setStatus(i % 2 == 0); + insertDataDTO.setTemperature(12.0F + i); + insertDataDTOS.add(insertDataDTO); + } + return insertDataDTOS; + } +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java new file mode 100644 index 0000000..c8326d2 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java @@ -0,0 +1,36 @@ +package com.muyu.data.process.domain; + +import com.muyu.data.process.domain.dto.IoTDbRecordAble; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: zi run + * @Date 2024/9/29 0:18 + * @Description 结果实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ResultEntity extends IoTDbRecordAble { + + /** + * 温度值 + */ + private Float temperature; + + /** + * 硬件标识 + */ + private String hardware; + + /** + * 状态标识 + */ + private Boolean status; + + /** + * 时间 + */ + private String time; + +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java new file mode 100644 index 0000000..52d196c --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java @@ -0,0 +1,43 @@ +package com.muyu.data.process.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: zi run + * @Date 2024/9/29 0:22 + * @Description 测试数据类型 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TestDataType { + + /** + * 温度值 + */ + private Float temperature; + + /** + * 硬件标识 + */ + private String hardware; + + /** + * 状态标识 + */ + private Boolean status; + + /** + * 测试Double类型 + */ + private Double testDouble; + + /** + * 测试Long类型 + */ + private Long testLong; +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java new file mode 100644 index 0000000..6525e38 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java @@ -0,0 +1,12 @@ +package com.muyu.data.process.domain.dto; + +import lombok.Data; + +/** + * @Author: zi run + * @Date 2024/9/29 0:23 + * @Description IoTDB数据库记录对象 + */ +@Data +public class IoTDbRecordAble { +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java new file mode 100644 index 0000000..3e025dc --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java @@ -0,0 +1,36 @@ +package com.muyu.data.process.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; + +import java.util.List; + +/** + * @Author: zi run + * @Date 2024/9/29 0:26 + * @Description 测量模式及其对应的值 数据传输对象 + */ +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class MeasurementSchemaValuesDTO { + + /** + * 测量模式列表,每个元素表示一个测量的定义,包括名称、数据类型等信息。 + */ + private List schemaList; + + /** + * 对应于测量模式的实际值列表,存储与 schemaList 中每个测量相对应的值。 + */ + private List values; + + /** + * 存储值为空的索引列表 + */ + private List valueIsNullIndex; +} diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/banner.txt b/cloud-modules/cloud-modules-data-process/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..39a6819 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml @@ -0,0 +1,45 @@ +# Tomcat +server: + port: 11000 + +nacos: + addr: 106.15.136.7:8848 + user-name: nacos + password: nacos + namespace: xzr + +spring: + application: + # 应用名称 + name: cloud-data-process + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名 + username: ${nacos.user-name} + # nacos密码 + password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + config: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名 + username: ${nacos.user-name} + # nacos密码 + password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + # 系统共享配置 + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # 系统环境Config共享配置 + - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml b/cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml new file mode 100644 index 0000000..6a776b3 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml b/cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml new file mode 100644 index 0000000..839788c --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml b/cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml new file mode 100644 index 0000000..1ad1029 --- /dev/null +++ b/cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/pom.xml b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/pom.xml index 911a9a6..fed66b6 100644 --- a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/pom.xml +++ b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/pom.xml @@ -22,7 +22,6 @@ - com.alibaba.cloud diff --git a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/enterprise/CloudEnterpriseApplication.java b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/enterprise/CloudEnterpriseApplication.java index ddd295f..6429815 100644 --- a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/enterprise/CloudEnterpriseApplication.java +++ b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/enterprise/CloudEnterpriseApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** - * 系统模块 + * 企业平台微服务启动类 * * @author muyu */ diff --git a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml index aed0523..1f2e969 100644 --- a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr spring: application: diff --git a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml index eea6728..dd31e1b 100644 --- a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr # Spring spring: diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml index 178e17b..7619514 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr # Spring spring: diff --git a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml index 9390135..296688a 100644 --- a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr spring: application: diff --git a/cloud-modules/pom.xml b/cloud-modules/pom.xml index cd65b6b..c104eeb 100644 --- a/cloud-modules/pom.xml +++ b/cloud-modules/pom.xml @@ -14,6 +14,7 @@ cloud-modules-file cloud-modules-enterprise cloud-weixin-mp + cloud-modules-data-process cloud-modules diff --git a/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml b/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml index ddca326..f90fa0e 100644 --- a/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml +++ b/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: dev + namespace: xzr # Spring spring: diff --git a/pom.xml b/pom.xml index a49e303..def2bf5 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ 2.4.1 2.2.8 3.0.0 + 1.3.1 @@ -199,6 +200,13 @@ ${kafka.clients.verison} + + + org.apache.iotdb + iotdb-session + ${iotdb-session.verison} + + com.muyu From 423836afb705e890b0d2c50f32816d9a31e3174d Mon Sep 17 00:00:00 2001 From: xinzirun Date: Sun, 29 Sep 2024 11:58:18 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix():=20=E4=BF=AE=E5=A4=8DIoTDB=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/basic/service/IoTDBService.java | 230 ++++++++++++++++-- .../basic/service/impl/IoTDBServiceImpl.java | 199 +++++++++------ .../domain/{ => dto}/InsertDataDTO.java | 2 +- 3 files changed, 331 insertions(+), 100 deletions(-) rename cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/{ => dto}/InsertDataDTO.java (97%) diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java index 0a99fd6..a869c69 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java @@ -25,61 +25,240 @@ public interface IoTDBService { */ void insertTablet(Tablet tablet); + /** + * 将给定的 Tablets 插入到 IoTDB 数据库中。 + * + * @param tablets 一个 Map,包含要插入的 Tablets + */ void insertTablets(Map tablets); + /** + * 单条数据插入(string类型数据项) + * + * @param deviceId 设备名(表名)root.ln.wf01.wt01 + * @param time 时间戳 + * @param measurements 数据项列表 + * @param values 数据项对应值列表 + */ void insertStringRecord(String deviceId, long time, List measurements, List values); - void insertRecord(String deviceId, long time, List measurements, List types, List values); + /** + * 单条数据插入(不同类型数据项) + * + * @param deviceId 设备名(表名)root.ln.wf01.wt01 + * @param time 时间戳 + * @param measurements 数据项列表 + * @param types 数据项对应类型列表 + * @param values 数据项对应值列表 + */ + void insertRecord(String deviceId, long time, List measurements, + List types, List values); - void insertStringRecords(List deviceIds, List times, List> measurementsList, List> valuesList); + /** + * 多个设备多条数据插入(string类型数据项) + * + * @param deviceIds 多个设备名(表名)root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + void insertStringRecords(List deviceIds, List times, + List> measurementsList, List> valuesList); - void insertRecords(List deviceIds, List times, List> measurementsList, List> typesList, List> valuesList); + /** + * 多个设备多条数据插入(不同类型数据项) + * + * @param deviceIds 多个设备名(表名))root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param typesList 数据项对应类型列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + void insertRecords(List deviceIds, List times, List> measurementsList, + List> typesList, List> valuesList); - void insertStringRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> valuesList); + /** + * 单个设备多条数据插入(string类型数据项) + * + * @param deviceId 单个设备名(表名))root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + void insertStringRecordsOfOneDevice(String deviceId, List times, + List> measurementsList, List> valuesList); - void insertRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> typesList, List> valuesList); + /** + * 单个设备多条数据插入(不同类型数据项) + * + * @param deviceId 单个设备名(表名))root.ln.wf01.wt01 + * @param times 时间戳的列表 + * @param measurementsList 数据项列表的列表 + * @param typesList 数据项对应类型列表的列表 + * @param valuesList 数据项对应值列表的列表 + */ + void insertRecordsOfOneDevice(String deviceId, List times, List> measurementsList, + List> typesList, List> valuesList); + /** + * 删除数据(删除一个时间序列在某个时间点前或这个时间点的数据) + * + * @param path 单个字段 root.ln.wf01.wt01.temperature + * @param endTime 删除时间点 + */ void deleteData(String path, long endTime); + /** + * 删除数据(删除多个时间序列在某个时间点前或这个时间点的数据) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param endTime 删除时间点 + */ void deleteData(List paths, long endTime); - SessionDataSet executeRawDataQuery(List paths, long startTime, long endTime, long timeOut); + /** + * 数据查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param outTime 超时时间 + * @return SessionDataSet (Time,paths) + */ + SessionDataSet executeRawDataQuery(List paths, long startTime, long endTime, long outTime); - List executeRawDataQuery(List paths, long startTime, long endTime, long timeOut, Class clazz); + /** + * 数据查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) + * + * @param paths 多个字段(表名),例如:"root.ln.wf01.wt01.temperature" + * @param startTime 查询数据的起始时间(包含该时间点) + * @param endTime 查询数据的结束时间(不包含该时间点) + * @param outTime 超时时间,单位为毫秒,表示查询的最长等待时间 + * @param clazz 返回数据对应的对象类型,要求对象属性与数据库字段名一致 + * @param 返回数据的对象类型泛型 + * @return 查询结果的对象列表,如果查询失败则返回 null + */ + List executeRawDataQuery(List paths, long startTime, long endTime, long outTime, + Class clazz); + /** + * 最新点查询(查询最后一条时间戳大于等于某个时间点的数据) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param lastTime 结束时间 + * @return SessionDataSet + */ SessionDataSet executeLastDataQuery(List paths, long lastTime); + /** + * 最新点查询(查询最后一条时间戳大于等于某个时间点的数据) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param lastTime 结束时间 + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @return 查询结果的对象列表,如果查询失败则返回 null + * @param 返回数据的对象类型泛型 + */ List executeLastDataQuery(List paths, long lastTime, Class clazz); - SessionDataSet executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes); + /** + * 最新点查询(快速查询单设备下指定序列最新点) + * + * @param db root.ln.wf01 + * @param device root.ln.wf01.wt01 + * @param sensors temperature,status(字段名) + * @param isLegalPathNodes true(避免路径校验) + * @return SessionDataSet + */ + SessionDataSet executeLastDataQueryForOneDevice(String db, String device, + List sensors, boolean isLegalPathNodes); - List executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes, Class clazz); + /** + * 查询单个设备的最新数据(获取指定设备的最新传感器数据) + * + * @param db root.ln.wf01 + * @param device root.ln.wf01.wt01 + * @param sensors temperature,status(字段名) + * @param isLegalPathNodes true(避免路径校验) + * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) + * @return 查询结果的对象列表,如果查询失败则返回 null + * @param 返回数据的对象类型泛型 + */ + List executeLastDataQueryForOneDevice(String db, String device, List sensors, + boolean isLegalPathNodes, Class clazz); + /** + * 聚合查询 + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @return SessionDataSet + */ SessionDataSet executeAggregationQuery(List paths, List aggregations); - SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime); + /** + * 聚合查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @param startTime 开始时间(包含) + * @param endTime 结束时间 + * @return SessionDataSet + */ + SessionDataSet executeAggregationQuery(List paths, List aggregations, + long startTime, long endTime); - SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval); + /** + * 聚合查询(支持按照时间区间分段查询) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @param startTime 开始时间(包含) + * @param endTime 结束时间 + * @param interval 查询的时间间隔(单位为毫秒) + * @return SessionDataSet + */ + SessionDataSet executeAggregationQuery(List paths, List aggregations, + long startTime, long endTime, long interval); - SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval, long slidingStep); + /** + * 聚合查询(支持按照时间区间分段查询) + * + * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature + * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT + * @param startTime 开始时间(包含) + * @param endTime 结束时间 + * @param interval 查询的时间间隔(单位为毫秒) + * @param slidingStep 滑动步长(单位为毫秒) + * @return SessionDataSet + */ + SessionDataSet executeAggregationQuery(List paths, List aggregations, + long startTime, long endTime, long interval, long slidingStep); + /** + * SQL查询 + * + * @param sql SQL查询语句,支持IotDB的查询语法 + * @return 返回查询结果的 SessionDataSet,如果执行失败则返回 null + */ SessionDataSet executeQueryStatement(String sql); /** * SQL非查询 * - * @param sql + * @param sql SQL查询语句,支持IotDB的查询语法 */ void executeNonQueryStatement(String sql); /** * 封装处理数据 * - * @param sessionDataSet - * @param columnNames + * @param sessionDataSet 包含查询结果的SessionDataSet对象 + * @param titleList 列标题列表,用于映射字段名称 + * @return 返回封装后的数据列表,每个 Map 代表一行数据,键为列名,值为对应的字段值 */ - List> packagingMapData(SessionDataSet sessionDataSet, List columnNames); + List> packagingMapData(SessionDataSet sessionDataSet, List titleList); /** * 封装处理数据(不支持聚合查询) @@ -87,24 +266,25 @@ public interface IoTDBService { * @param sessionDataSet 查询返回的结果集 * @param titleList 查询返回的结果集内的字段名 * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) - * @param - * @return + * @return 返回封装后的对象列表,每个对象对应一行结果集数据 + * @param 返回对象的类型 */ - List packagingObjectData(SessionDataSet sessionDataSet, List titleList, Class clazz); + List packagingObjectData(SessionDataSet sessionDataSet, List titleList, + Class clazz); /** * 根据对象构建MeasurementSchemas * - * @param object 对象 - * @return + * @param obj 要从中提取字段信息的对象 + * @return 返回一个包含 MeasurementSchema 的列表 */ - List buildMeasurementSchemas(Object object); + List buildMeasurementSchemas(Object obj); /** * 根据对象构建MeasurementSchemaValuesDTO * - * @param object 对象 - * @return + * @param obj 要从中提取字段信息和对应值的对象 + * @return MeasurementSchemaValuesDTO 对象 */ - MeasurementSchemaValuesDTO buildMeasurementSchemasAndValues(Object object); + MeasurementSchemaValuesDTO buildMeasurementSchemasAndValues(Object obj); } diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java index d551a1a..fcbd374 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java @@ -57,8 +57,7 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 将给定的 Tablets 插入到 IoTDB 数据库中。 * - * @param tablets 一个 Map,包含要插入的 Tablets,键为 String 类型,值为 Tablet 对象。 - * Tablets 应该已经准备好并符合 IoTDB 的插入要求。 + * @param tablets 一个 Map,包含要插入的 Tablets */ @Override public void insertTablets(Map tablets) { @@ -101,14 +100,16 @@ public class IoTDBServiceImpl implements IoTDBService { * @param values 数据项对应值列表 */ @Override - public void insertRecord(String deviceId, long time, List measurements, List types, List values) { + public void insertRecord(String deviceId, long time, List measurements, + List types, List values) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); try { - log.info("iotdb数据入库:device_id:[{}], measurements:[{}], types:[{}], values:[{}]", deviceId, measurements, types, values); + log.info("iotdb数据入库:device_id:[{}], measurements:[{}], types:[{}], values:[{}]", + deviceId, measurements, types, values); sessionPool.insertRecord(deviceId, time, measurements, types, values); } catch (Exception e) { - log.error("IotDBSession insertRecordHasTypes失败: deviceId={}, time={}, measurements={},types={}, values={}, error={}", - deviceId, time, measurements, types, values, e.getMessage()); + log.error("IotDBSession insertRecordHasTypes失败: deviceId={}, time={}, measurements={}, types={}, " + + "values={}, error={}", deviceId, time, measurements, types, values, e.getMessage()); } } @@ -122,14 +123,16 @@ public class IoTDBServiceImpl implements IoTDBService { * @param valuesList 数据项对应值列表的列表 */ @Override - public void insertStringRecords(List deviceIds, List times, List> measurementsList, List> valuesList) { + public void insertStringRecords(List deviceIds, List times, List> measurementsList, + List> valuesList) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); try { - log.info("iotdb数据入库:deviceIds:[{}], measurementsList:[{}], valuesList:[{}]", deviceIds, measurementsList, valuesList); + log.info("iotdb数据入库:deviceIds:[{}], measurementsList:[{}], valuesList:[{}]", + deviceIds, measurementsList, valuesList); sessionPool.insertRecords(deviceIds, times, measurementsList, valuesList); } catch (Exception e) { - log.error("IotDBSession insertRecords失败: deviceIds={}, times={}, measurementsList={}, valuesList={}, error={}", - deviceIds, times, measurementsList, valuesList, e.getMessage()); + log.error("IotDBSession insertRecords失败: deviceIds={}, times={}, measurementsList={}, " + + "valuesList={}, error={}", deviceIds, times, measurementsList, valuesList, e.getMessage()); } } @@ -143,13 +146,16 @@ public class IoTDBServiceImpl implements IoTDBService { * @param valuesList 数据项对应值列表的列表 */ @Override - public void insertRecords(List deviceIds, List times, List> measurementsList, List> typesList, List> valuesList) { + public void insertRecords(List deviceIds, List times, List> measurementsList, + List> typesList, List> valuesList) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); try { - log.info("iotdb数据入库:deviceIds:[{}], measurementsList:[{}], typesList:[{}], valuesList:[{}]", deviceIds, measurementsList, typesList, valuesList); + log.info("iotdb数据入库:deviceIds:[{}], measurementsList:[{}], typesList:[{}], valuesList:[{}]", + deviceIds, measurementsList, typesList, valuesList); sessionPool.insertRecords(deviceIds, times, measurementsList, typesList, valuesList); } catch (Exception e) { - log.error("IotDBSession insertRecords失败: deviceIds={}, times={}, measurementsList={}, typesList=[],valuesList={}, error={}", + log.error("IotDBSession insertRecords失败: deviceIds={}, times={}, measurementsList={}, typesList={}, " + + "valuesList={}, error={}", deviceIds, times, measurementsList, typesList, valuesList, e.getMessage()); } } @@ -163,13 +169,16 @@ public class IoTDBServiceImpl implements IoTDBService { * @param valuesList 数据项对应值列表的列表 */ @Override - public void insertStringRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> valuesList) { + public void insertStringRecordsOfOneDevice(String deviceId, List times, List> measurementsList, + List> valuesList) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); try { - log.info("iotdb数据入库:deviceId:[{}], measurementsList:[{}], valuesList:[{}]", deviceId, measurementsList, valuesList); + log.info("iotdb数据入库:deviceId:[{}], measurementsList:[{}], valuesList:[{}]", + deviceId, measurementsList, valuesList); sessionPool.insertStringRecordsOfOneDevice(deviceId, times, measurementsList, valuesList); } catch (Exception e) { - log.error("IotDBSession insertStringRecordsOfOneDevice失败: deviceId={}, times={}, measurementsList={}, valuesList={}, error={}", + log.error("IotDBSession insertStringRecordsOfOneDevice失败: deviceId={}, times={}, " + + "measurementsList={}, valuesList={}, error={}", deviceId, times, measurementsList, valuesList, e.getMessage()); } } @@ -184,13 +193,17 @@ public class IoTDBServiceImpl implements IoTDBService { * @param valuesList 数据项对应值列表的列表 */ @Override - public void insertRecordsOfOneDevice(String deviceId, List times, List> measurementsList, List> typesList, List> valuesList) { + public void insertRecordsOfOneDevice(String deviceId, List times, List> measurementsList, + List> typesList, List> valuesList) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); try { - log.info("iotdb数据入库:deviceId:[{}], measurementsList:[{}], typesList:[{}], valuesList:[{}]", deviceId, measurementsList, typesList, valuesList); + log.info("iotdb数据入库:deviceId:[{}], measurementsList:[{}], typesList:[{}], valuesList:[{}]", + deviceId, measurementsList, typesList, valuesList); sessionPool.insertRecordsOfOneDevice(deviceId, times, measurementsList, typesList, valuesList); } catch (Exception e) { - log.error("IotDBSession insertRecordsOfOneDevice失败: deviceId={}, times={}, measurementsList={}, typesList=[],valuesList={}, error={}", deviceId, times, measurementsList, typesList, valuesList, e.getMessage()); + log.error("IotDBSession insertRecordsOfOneDevice失败: deviceId={}, times={}, " + + "measurementsList={},typesList={},valuesList={}, error={}", + deviceId, times, measurementsList, typesList, valuesList, e.getMessage()); } } @@ -242,11 +255,13 @@ public class IoTDBServiceImpl implements IoTDBService { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); SessionDataSetWrapper sessionDataSetWrapper = null; try { - log.info("iotdb数据查询:paths:[{}], startTime:[{}], endTime:[{}],outTime:[{}]", paths, startTime, endTime, outTime); + log.info("iotdb数据查询:paths:[{}], startTime:[{}], endTime:[{}],outTime:[{}]", + paths, startTime, endTime, outTime); sessionDataSetWrapper = sessionPool.executeRawDataQuery(paths, startTime, endTime, outTime); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeRawDataQuery失败: paths={}, startTime:[{}], endTime:[{}],outTime:[{}],error={}", paths, startTime, endTime, outTime, e.getMessage()); + log.error("IotDBSession executeRawDataQuery失败: paths={}, startTime:[{}], endTime:[{}], " + + "outTime:[{}], error={}", paths, startTime, endTime, outTime, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -256,23 +271,25 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 数据查询(时间序列原始数据范围查询,时间范围为左闭右开区间,包含开始时间但不包含结束时间) * - * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature - * @param startTime 开始时间 - * @param endTime 结束时间 - * @param outTime 超时时间 - * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) - * @param - * @return + * @param paths 多个字段(表名),例如:"root.ln.wf01.wt01.temperature" + * @param startTime 查询数据的起始时间(包含该时间点) + * @param endTime 查询数据的结束时间(不包含该时间点) + * @param outTime 超时时间,单位为毫秒,表示查询的最长等待时间 + * @param clazz 返回数据对应的对象类型,要求对象属性与数据库字段名一致 + * @param 返回数据的对象类型泛型 + * @return 查询结果的对象列表,如果查询失败则返回 null */ @Override - public List executeRawDataQuery(List paths, long startTime, long endTime, long outTime, Class clazz) { + public List executeRawDataQuery(List paths, long startTime, long endTime, long outTime, + Class clazz) { SessionDataSet sessionDataSet = executeRawDataQuery(paths, startTime, endTime, outTime); List columnNames = sessionDataSet.getColumnNames(); List resultEntities = null; try { resultEntities = packagingObjectData(sessionDataSet, columnNames, clazz); } catch (Exception e) { - log.error("IotDBSession executeRawDataQuery失败: paths={}, startTime:[{}], endTime:[{}],outTime:[{}],error={}", paths, startTime, endTime, outTime, e.getMessage()); + log.error("IotDBSession executeRawDataQuery失败: paths={}, startTime:[{}], endTime:[{}], " + + "outTime:[{}], error={}", paths, startTime, endTime, outTime, e.getMessage()); } return resultEntities; } @@ -293,7 +310,8 @@ public class IoTDBServiceImpl implements IoTDBService { sessionDataSetWrapper = sessionPool.executeLastDataQuery(paths, lastTime); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeLastDataQuery失败: paths={}, lastTime:[{}], error={}", paths, lastTime, e.getMessage()); + log.error("IotDBSession executeLastDataQuery失败: paths={}, lastTime:[{}], error={}", + paths, lastTime, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -303,11 +321,11 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 最新点查询(查询最后一条时间戳大于等于某个时间点的数据) * - * @param * @param paths 多个字段(表名)) root.ln.wf01.wt01.temperature * @param lastTime 结束时间 * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) - * @return + * @return 查询结果的对象列表,如果查询失败则返回 null + * @param 返回数据的对象类型泛型 */ @Override public List executeLastDataQuery(List paths, long lastTime, Class clazz) { @@ -317,7 +335,8 @@ public class IoTDBServiceImpl implements IoTDBService { try { resultEntities = packagingObjectData(sessionDataSet, columnNames, clazz); } catch (Exception e) { - log.error("IotDBSession executeLastDataQuery失败: paths={}, lastTime:[{}], error={}", paths, lastTime, e.getMessage()); + log.error("IotDBSession executeLastDataQuery失败: paths={}, lastTime:[{}], error={}", + paths, lastTime, e.getMessage()); } return resultEntities; } @@ -332,15 +351,18 @@ public class IoTDBServiceImpl implements IoTDBService { * @return SessionDataSet */ @Override - public SessionDataSet executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes) { + public SessionDataSet executeLastDataQueryForOneDevice(String db, String device, List sensors, + boolean isLegalPathNodes) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); SessionDataSetWrapper sessionDataSetWrapper = null; try { - log.info("iotdb数据查询:db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}]", db, device, sensors, isLegalPathNodes); + log.info("iotdb数据查询:db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}]", + db, device, sensors, isLegalPathNodes); sessionDataSetWrapper = sessionPool.executeLastDataQueryForOneDevice(db, device, sensors, isLegalPathNodes); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeLastDataQueryForOneDevice失败: db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}], error={}", db, device, sensors, isLegalPathNodes, e.getMessage()); + log.error("IotDBSession executeLastDataQueryForOneDevice失败: db:[{}], device:[{}], sensors:[{}], " + + "isLegalPathNodes:[{}], error={}", db, device, sensors, isLegalPathNodes, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -348,23 +370,28 @@ public class IoTDBServiceImpl implements IoTDBService { } /** + * 查询单个设备的最新数据(获取指定设备的最新传感器数据) + * * @param db root.ln.wf01 * @param device root.ln.wf01.wt01 * @param sensors temperature,status(字段名) * @param isLegalPathNodes true(避免路径校验) * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) - * @param - * @return + * @return 查询结果的对象列表,如果查询失败则返回 null + * @param 返回数据的对象类型泛型 */ @Override - public List executeLastDataQueryForOneDevice(String db, String device, List sensors, boolean isLegalPathNodes, Class clazz) { + public List executeLastDataQueryForOneDevice(String db, String device, List sensors, + boolean isLegalPathNodes, + Class clazz) { SessionDataSet sessionDataSet = executeLastDataQueryForOneDevice(db, device, sensors, isLegalPathNodes); List columnNames = sessionDataSet.getColumnNames(); List resultEntities = null; try { resultEntities = packagingObjectData(sessionDataSet, columnNames, clazz); } catch (Exception e) { - log.error("IotDBSession executeLastDataQueryForOneDevice失败: db:[{}], device:[{}],sensors:[{}], isLegalPathNodes:[{}], error={}", db, device, sensors, isLegalPathNodes, e.getMessage()); + log.error("IotDBSession executeLastDataQueryForOneDevice失败: db:[{}], device:[{}],sensors:[{}], " + + "isLegalPathNodes:[{}], error={}", db, device, sensors, isLegalPathNodes, e.getMessage()); } return resultEntities; } @@ -385,7 +412,8 @@ public class IoTDBServiceImpl implements IoTDBService { sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,error={}", paths, aggregations, e.getMessage()); + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,error={}", + paths, aggregations, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -402,15 +430,18 @@ public class IoTDBServiceImpl implements IoTDBService { * @return SessionDataSet */ @Override - public SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime) { + public SessionDataSet executeAggregationQuery(List paths, List aggregations, + long startTime, long endTime) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); SessionDataSetWrapper sessionDataSetWrapper = null; try { - log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}]", paths, aggregations, startTime, endTime); + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}]", + paths, aggregations, startTime, endTime); sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,startTime:[{}], endTime:[{}],error={}", paths, aggregations, startTime, endTime, e.getMessage()); + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}], " + + "startTime:[{}], endTime:[{}],error={}", paths, aggregations, startTime, endTime, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -424,19 +455,25 @@ public class IoTDBServiceImpl implements IoTDBService { * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT * @param startTime 开始时间(包含) * @param endTime 结束时间 - * @param interval + * @param interval 查询的时间间隔(单位为毫秒) * @return SessionDataSet */ @Override - public SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval) { + public SessionDataSet executeAggregationQuery(List paths, List aggregations, + long startTime, long endTime, long interval) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); SessionDataSetWrapper sessionDataSetWrapper = null; try { - log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}] ,interval:[{}]", paths, aggregations, startTime, endTime, interval); - sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime, interval); + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}] ,interval:[{}]", + paths, aggregations, startTime, endTime, interval); + sessionDataSetWrapper = sessionPool.executeAggregationQuery( + paths, aggregations, startTime, endTime, interval + ); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,startTime:[{}], endTime:[{}], interval:[{}], error={}", paths, aggregations, startTime, endTime, interval, e.getMessage()); + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] , " + + "startTime:[{}], endTime:[{}], interval:[{}], error={}", + paths, aggregations, startTime, endTime, interval, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -450,21 +487,26 @@ public class IoTDBServiceImpl implements IoTDBService { * @param aggregations 聚合操作 TAggregationType.SUM,TAggregationType.COUNT * @param startTime 开始时间(包含) * @param endTime 结束时间 - * @param interval - * @param slidingStep + * @param interval 查询的时间间隔(单位为毫秒) + * @param slidingStep 滑动步长(单位为毫秒) * @return SessionDataSet */ @Override - public SessionDataSet executeAggregationQuery(List paths, List aggregations, long startTime, long endTime, long interval, long slidingStep) { + public SessionDataSet executeAggregationQuery(List paths, List aggregations, + long startTime, long endTime, long interval, long slidingStep) { SessionPool sessionPool = ioTDBSessionConfig.getSessionPool(); SessionDataSetWrapper sessionDataSetWrapper = null; try { - log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}] ,interval:[{}], slidingStep:[{}]", paths, aggregations, startTime, endTime, interval, slidingStep); - sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime, interval, slidingStep); + log.info("iotdb聚合查询:paths:[{}], aggregations:[{}],startTime:[{}], endTime:[{}] ,interval:[{}], " + + "slidingStep:[{}]", paths, aggregations, startTime, endTime, interval, slidingStep); + sessionDataSetWrapper = sessionPool.executeAggregationQuery(paths, aggregations, startTime, endTime, + interval, slidingStep); return sessionDataSetWrapper.getSessionDataSet(); } catch (Exception e) { - log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] ,startTime:[{}], endTime:[{}], interval:[{}], slidingStep:[{}] ,error={}", paths, aggregations, startTime, endTime, interval, slidingStep, e.getMessage()); + log.error("IotDBSession executeAggregationQuery失败: paths:[{}], aggregations:[{}] , " + + "startTime:[{}], endTime:[{}], interval:[{}], slidingStep:[{}] ,error={}", + paths, aggregations, startTime, endTime, interval, slidingStep, e.getMessage()); } finally { sessionPool.closeResultSet(sessionDataSetWrapper); } @@ -474,8 +516,8 @@ public class IoTDBServiceImpl implements IoTDBService { /** * SQL查询 * - * @param sql - * @return + * @param sql SQL查询语句,支持IotDB的查询语法 + * @return 返回查询结果的 SessionDataSet,如果执行失败则返回 null */ @Override public SessionDataSet executeQueryStatement(String sql) { @@ -497,7 +539,7 @@ public class IoTDBServiceImpl implements IoTDBService { /** * SQL非查询 * - * @param sql + * @param sql SQL查询语句,支持IotDB的查询语法 */ @Override public void executeNonQueryStatement(String sql) { @@ -513,8 +555,9 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 封装处理数据 * - * @param sessionDataSet - * @param titleList + * @param sessionDataSet 包含查询结果的SessionDataSet对象 + * @param titleList 列标题列表,用于映射字段名称 + * @return 返回封装后的数据列表,每个 Map 代表一行数据,键为列名,值为对应的字段值 */ @SneakyThrows @Override @@ -527,14 +570,16 @@ public class IoTDBServiceImpl implements IoTDBService { Map resultMap = new HashMap<>(); RowRecord next = sessionDataSet.next(); List fields = next.getFields(); - String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp()); + String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(next.getTimestamp()); resultMap.put("time", timeString); for (int i = 0; i < fields.size(); i++) { Field field = fields.get(i); if (field.getDataType() == null || field.getObjectValue(field.getDataType()) == null) { resultMap.put(splitString(titleList.get(i)), null); } else { - resultMap.put(splitString(titleList.get(i)), field.getObjectValue(field.getDataType()).toString()); + resultMap.put(splitString(titleList.get(i)), + field.getObjectValue(field.getDataType()).toString()); } } resultList.add(resultMap); @@ -549,12 +594,13 @@ public class IoTDBServiceImpl implements IoTDBService { * @param sessionDataSet 查询返回的结果集 * @param titleList 查询返回的结果集内的字段名 * @param clazz 返回数据对应的对象(对象属性必须与字段名对应) - * @param - * @return + * @return 返回封装后的对象列表,每个对象对应一行结果集数据 + * @param 返回对象的类型 */ @SneakyThrows @Override - public List packagingObjectData(SessionDataSet sessionDataSet, List titleList, Class clazz) { + public List packagingObjectData(SessionDataSet sessionDataSet, List titleList, + Class clazz) { int fetchSize = sessionDataSet.getFetchSize(); List resultList = new ArrayList<>(); titleList.remove("Time"); @@ -563,7 +609,8 @@ public class IoTDBServiceImpl implements IoTDBService { Map resultMap = new HashMap<>(); RowRecord next = sessionDataSet.next(); List fields = next.getFields(); - String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp()); + String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(next.getTimestamp()); resultMap.put("time", timeString); if (titleList.stream().anyMatch(str -> str.contains("."))) { for (int i = 0; i < fields.size(); i++) { @@ -581,7 +628,10 @@ public class IoTDBServiceImpl implements IoTDBService { Field fieldDataType = fields.get(2); if (fieldName.getDataType() != null && fieldName.getObjectValue(fieldName.getDataType()) != null) { String mapKey = fieldName.getObjectValue(fieldName.getDataType()).toString(); - Object mapValue = convertStringToType(fieldValue.getObjectValue(fieldValue.getDataType()).toString(), fieldDataType.getObjectValue(fieldDataType.getDataType()).toString()); + Object mapValue = convertStringToType( + fieldValue.getObjectValue(fieldValue.getDataType()).toString(), + fieldDataType.getObjectValue(fieldDataType.getDataType()).toString() + ); resultMap.put(splitString(mapKey), mapValue); } } @@ -596,7 +646,7 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 分割获取字段名 * - * @param str + * @param str 输入的字符串 * @return 字段名 */ public static String splitString(String str) { @@ -667,8 +717,8 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 根据对象构建MeasurementSchemas * - * @param obj 对象 - * @return + * @param obj 要从中提取字段信息的对象 + * @return 返回一个包含 MeasurementSchema 的列表 */ @Override public List buildMeasurementSchemas(Object obj) { @@ -685,8 +735,8 @@ public class IoTDBServiceImpl implements IoTDBService { /** * 根据对象构建MeasurementSchemaValuesDTO * - * @param obj 对象 - * @return + * @param obj 要从中提取字段信息和对应值的对象 + * @return MeasurementSchemaValuesDTO 对象 */ @SneakyThrows @Override @@ -698,7 +748,8 @@ public class IoTDBServiceImpl implements IoTDBService { List valuesIsNullIndex = new ArrayList<>(); int valueIndex = 0; for (java.lang.reflect.Field field : fields) { - MeasurementSchema measurementSchema = new MeasurementSchema(field.getName(), getTsDataTypeByString(field.getType().getName())); + MeasurementSchema measurementSchema = new MeasurementSchema(field.getName(), + getTsDataTypeByString(field.getType().getName())); schemaList.add(measurementSchema); Object value = field.get(obj); if (value == null) { diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/InsertDataDTO.java similarity index 97% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java rename to cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/InsertDataDTO.java index 91d5808..1560ac6 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/InsertDataDTO.java +++ b/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/InsertDataDTO.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.domain; +package com.muyu.data.process.domain.dto; import lombok.AllArgsConstructor; import lombok.Builder; From 6594363a91752fb488e9c845cdf1caf6dc6236d7 Mon Sep 17 00:00:00 2001 From: xinzirun Date: Sun, 29 Sep 2024 16:06:24 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix():=20=E4=BF=AE=E5=A4=8Dcloud-data-proce?= =?UTF-8?q?ss=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E5=BE=AE=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9D=97=20--->=20cloud-event-process?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E5=BE=AE=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 4 ++-- .../event/process/CloudEventProcessApplication.java} | 8 ++++---- .../process/basic/config/IoTDBSessionConfig.java | 2 +- .../event}/process/basic/service/IoTDBService.java | 6 +++--- .../process/basic/service/impl/IoTDBServiceImpl.java | 10 +++++----- .../java/com/muyu/event}/process/domain/DataJSON.java | 2 +- .../com/muyu/event}/process/domain/ResultEntity.java | 4 ++-- .../com/muyu/event}/process/domain/TestDataType.java | 2 +- .../muyu/event}/process/domain/dto/InsertDataDTO.java | 2 +- .../event}/process/domain/dto/IoTDbRecordAble.java | 2 +- .../process/domain/dto/MeasurementSchemaValuesDTO.java | 2 +- .../src/main/resources/banner.txt | 0 .../src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/logback/dev.xml | 2 +- .../src/main/resources/logback/prod.xml | 2 +- .../src/main/resources/logback/test.xml | 2 +- cloud-modules/pom.xml | 2 +- 17 files changed, 27 insertions(+), 27 deletions(-) rename cloud-modules/{cloud-modules-data-process => cloud-modules-event-process}/pom.xml (96%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java => cloud-modules-event-process/src/main/java/com/muyu/event/process/CloudEventProcessApplication.java} (68%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/basic/config/IoTDBSessionConfig.java (98%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/basic/service/IoTDBService.java (98%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/basic/service/impl/IoTDBServiceImpl.java (99%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/domain/DataJSON.java (94%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/domain/ResultEntity.java (83%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/domain/TestDataType.java (94%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/domain/dto/InsertDataDTO.java (97%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/domain/dto/IoTDbRecordAble.java (78%) rename cloud-modules/{cloud-modules-data-process/src/main/java/com/muyu/data => cloud-modules-event-process/src/main/java/com/muyu/event}/process/domain/dto/MeasurementSchemaValuesDTO.java (95%) rename cloud-modules/{cloud-modules-data-process => cloud-modules-event-process}/src/main/resources/banner.txt (100%) rename cloud-modules/{cloud-modules-data-process => cloud-modules-event-process}/src/main/resources/bootstrap.yml (94%) rename cloud-modules/{cloud-modules-data-process => cloud-modules-event-process}/src/main/resources/logback/dev.xml (97%) rename cloud-modules/{cloud-modules-data-process => cloud-modules-event-process}/src/main/resources/logback/prod.xml (98%) rename cloud-modules/{cloud-modules-data-process => cloud-modules-event-process}/src/main/resources/logback/test.xml (98%) diff --git a/cloud-modules/cloud-modules-data-process/pom.xml b/cloud-modules/cloud-modules-event-process/pom.xml similarity index 96% rename from cloud-modules/cloud-modules-data-process/pom.xml rename to cloud-modules/cloud-modules-event-process/pom.xml index cb4a354..20a8257 100644 --- a/cloud-modules/cloud-modules-data-process/pom.xml +++ b/cloud-modules/cloud-modules-event-process/pom.xml @@ -9,7 +9,7 @@ 3.6.3 - cloud-modules-data-process + cloud-modules-event-process 17 @@ -18,7 +18,7 @@ - cloud-modules-data-process 数据处理 + cloud-modules-event-process 事件处理 diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/CloudEventProcessApplication.java similarity index 68% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/CloudEventProcessApplication.java index b5ba238..46b5858 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/CloudDataProcessApplication.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/CloudEventProcessApplication.java @@ -1,4 +1,4 @@ -package com.muyu.data.process; +package com.muyu.event.process; import com.muyu.common.security.annotation.EnableCustomConfig; import com.muyu.common.security.annotation.EnableMyFeignClients; @@ -8,13 +8,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @Author: zi run * @Date 2024/9/28 22:31 - * @Description 数据处理微服启动类 + * @Description 事件处理微服启动类 */ @EnableCustomConfig @EnableMyFeignClients @SpringBootApplication -public class CloudDataProcessApplication { +public class CloudEventProcessApplication { public static void main(String[] args) { - SpringApplication.run(CloudDataProcessApplication.class, args); + SpringApplication.run(CloudEventProcessApplication.class, args); } } diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/config/IoTDBSessionConfig.java similarity index 98% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/config/IoTDBSessionConfig.java index 3bf7de1..01a498c 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/config/IoTDBSessionConfig.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/config/IoTDBSessionConfig.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.basic.config; +package com.muyu.event.process.basic.config; import lombok.extern.slf4j.Slf4j; import org.apache.iotdb.session.pool.SessionPool; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/IoTDBService.java similarity index 98% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/IoTDBService.java index a869c69..5c4ac01 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/IoTDBService.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/IoTDBService.java @@ -1,7 +1,7 @@ -package com.muyu.data.process.basic.service; +package com.muyu.event.process.basic.service; -import com.muyu.data.process.domain.dto.IoTDbRecordAble; -import com.muyu.data.process.domain.dto.MeasurementSchemaValuesDTO; +import com.muyu.event.process.domain.dto.IoTDbRecordAble; +import com.muyu.event.process.domain.dto.MeasurementSchemaValuesDTO; import org.apache.iotdb.common.rpc.thrift.TAggregationType; import org.apache.iotdb.isession.SessionDataSet; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/impl/IoTDBServiceImpl.java similarity index 99% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/impl/IoTDBServiceImpl.java index fcbd374..73e67e2 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/basic/service/impl/IoTDBServiceImpl.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/impl/IoTDBServiceImpl.java @@ -1,10 +1,10 @@ -package com.muyu.data.process.basic.service.impl; +package com.muyu.event.process.basic.service.impl; import com.alibaba.fastjson.JSON; -import com.muyu.data.process.basic.config.IoTDBSessionConfig; -import com.muyu.data.process.basic.service.IoTDBService; -import com.muyu.data.process.domain.dto.IoTDbRecordAble; -import com.muyu.data.process.domain.dto.MeasurementSchemaValuesDTO; +import com.muyu.event.process.basic.config.IoTDBSessionConfig; +import com.muyu.event.process.basic.service.IoTDBService; +import com.muyu.event.process.domain.dto.IoTDbRecordAble; +import com.muyu.event.process.domain.dto.MeasurementSchemaValuesDTO; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/DataJSON.java similarity index 94% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/DataJSON.java index 86c075e..16853f3 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/DataJSON.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/DataJSON.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.domain; +package com.muyu.event.process.domain; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/ResultEntity.java similarity index 83% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/ResultEntity.java index c8326d2..02d7d96 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/ResultEntity.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/ResultEntity.java @@ -1,6 +1,6 @@ -package com.muyu.data.process.domain; +package com.muyu.event.process.domain; -import com.muyu.data.process.domain.dto.IoTDbRecordAble; +import com.muyu.event.process.domain.dto.IoTDbRecordAble; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/TestDataType.java similarity index 94% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/TestDataType.java index 52d196c..dd75553 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/TestDataType.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/TestDataType.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.domain; +package com.muyu.event.process.domain; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/InsertDataDTO.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/InsertDataDTO.java similarity index 97% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/InsertDataDTO.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/InsertDataDTO.java index 1560ac6..d213bd8 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/InsertDataDTO.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/InsertDataDTO.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.domain.dto; +package com.muyu.event.process.domain.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/IoTDbRecordAble.java similarity index 78% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/IoTDbRecordAble.java index 6525e38..957dfb5 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/IoTDbRecordAble.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/IoTDbRecordAble.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.domain.dto; +package com.muyu.event.process.domain.dto; import lombok.Data; diff --git a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/MeasurementSchemaValuesDTO.java similarity index 95% rename from cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/MeasurementSchemaValuesDTO.java index 3e025dc..8681f19 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/java/com/muyu/data/process/domain/dto/MeasurementSchemaValuesDTO.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/MeasurementSchemaValuesDTO.java @@ -1,4 +1,4 @@ -package com.muyu.data.process.domain.dto; +package com.muyu.event.process.domain.dto; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/banner.txt b/cloud-modules/cloud-modules-event-process/src/main/resources/banner.txt similarity index 100% rename from cloud-modules/cloud-modules-data-process/src/main/resources/banner.txt rename to cloud-modules/cloud-modules-event-process/src/main/resources/banner.txt diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml similarity index 94% rename from cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml rename to cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml index 39a6819..47bf553 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml @@ -11,7 +11,7 @@ nacos: spring: application: # 应用名称 - name: cloud-data-process + name: cloud-event-process profiles: # 环境配置 active: dev diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml b/cloud-modules/cloud-modules-event-process/src/main/resources/logback/dev.xml similarity index 97% rename from cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml rename to cloud-modules/cloud-modules-event-process/src/main/resources/logback/dev.xml index 6a776b3..1e47ab3 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/dev.xml +++ b/cloud-modules/cloud-modules-event-process/src/main/resources/logback/dev.xml @@ -1,7 +1,7 @@ - + diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml b/cloud-modules/cloud-modules-event-process/src/main/resources/logback/prod.xml similarity index 98% rename from cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml rename to cloud-modules/cloud-modules-event-process/src/main/resources/logback/prod.xml index 839788c..d59fdeb 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/prod.xml +++ b/cloud-modules/cloud-modules-event-process/src/main/resources/logback/prod.xml @@ -1,7 +1,7 @@ - + diff --git a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml b/cloud-modules/cloud-modules-event-process/src/main/resources/logback/test.xml similarity index 98% rename from cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml rename to cloud-modules/cloud-modules-event-process/src/main/resources/logback/test.xml index 1ad1029..cb4420b 100644 --- a/cloud-modules/cloud-modules-data-process/src/main/resources/logback/test.xml +++ b/cloud-modules/cloud-modules-event-process/src/main/resources/logback/test.xml @@ -1,7 +1,7 @@ - + diff --git a/cloud-modules/pom.xml b/cloud-modules/pom.xml index c104eeb..d877d6c 100644 --- a/cloud-modules/pom.xml +++ b/cloud-modules/pom.xml @@ -14,7 +14,7 @@ cloud-modules-file cloud-modules-enterprise cloud-weixin-mp - cloud-modules-data-process + cloud-modules-event-process cloud-modules From 7100bf71bfcd03208d97a5d4d53b8dc7d9ab1cbf Mon Sep 17 00:00:00 2001 From: xinzirun Date: Mon, 30 Sep 2024 00:52:20 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat():=20=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud-modules-event-process/pom.xml | 12 ++- .../muyu/event/process/basic/CustomEvent.java | 37 ++++++++ .../event/process/basic/EventListener.java | 18 ++++ .../event/process/basic/EventPublisher.java | 39 ++++++++ .../process/config/EventListenerConfig.java | 19 ++++ .../event/process/consumer/TestConsumer.java | 52 +++++++++++ .../process/consumer/VehicleConsumer.java | 82 +++++++++++++++++ .../controller/TestEventController.java | 88 +++++++++++++++++++ .../basic/config/IoTDBSessionConfig.java | 2 +- .../basic/service/IService.java} | 10 +-- .../basic/service/impl/ServiceImpl.java} | 20 ++--- .../process/{ => iotdb}/domain/DataJSON.java | 2 +- .../{ => iotdb}/domain/ResultEntity.java | 4 +- .../{ => iotdb}/domain/TestDataType.java | 2 +- .../{ => iotdb}/domain/dto/InsertDataDTO.java | 2 +- .../domain/dto/IoTDbRecordAble.java | 2 +- .../dto/MeasurementSchemaValuesDTO.java | 2 +- .../process/iotdb/service/IoTDBService.java | 11 +++ .../iotdb/service/TestIoTDBService.java | 20 +++++ .../iotdb/service/impl/IoTDBServiceImpl.java | 14 +++ .../service/impl/TestIoTDBServiceImpl.java | 33 +++++++ .../process/listener/AddDatabaseListener.java | 43 +++++++++ .../src/main/resources/bootstrap.yml | 4 +- 23 files changed, 491 insertions(+), 27 deletions(-) create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/TestConsumer.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/basic/config/IoTDBSessionConfig.java (97%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{basic/service/IoTDBService.java => iotdb/basic/service/IService.java} (97%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{basic/service/impl/IoTDBServiceImpl.java => iotdb/basic/service/impl/ServiceImpl.java} (98%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/domain/DataJSON.java (93%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/domain/ResultEntity.java (81%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/domain/TestDataType.java (93%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/domain/dto/InsertDataDTO.java (97%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/domain/dto/IoTDbRecordAble.java (75%) rename cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/{ => iotdb}/domain/dto/MeasurementSchemaValuesDTO.java (94%) create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/IoTDBService.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/TestIoTDBService.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/IoTDBServiceImpl.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/TestIoTDBServiceImpl.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java diff --git a/cloud-modules/cloud-modules-event-process/pom.xml b/cloud-modules/cloud-modules-event-process/pom.xml index 20a8257..0c734d7 100644 --- a/cloud-modules/cloud-modules-event-process/pom.xml +++ b/cloud-modules/cloud-modules-event-process/pom.xml @@ -52,6 +52,12 @@ mysql-connector-j + + + org.apache.iotdb + iotdb-session + + com.muyu @@ -82,10 +88,10 @@ cloud-common-core - + - org.apache.iotdb - iotdb-session + com.muyu + cloud-common-kafka \ No newline at end of file diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java new file mode 100644 index 0000000..2b80585 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java @@ -0,0 +1,37 @@ +package com.muyu.event.process.basic; + +import com.alibaba.fastjson2.JSONObject; +import org.springframework.context.ApplicationEvent; + +/** + * @Author: zi run + * @Date 2024/9/29 21:19 + * @Description 自定义事件 + */ +public class CustomEvent extends ApplicationEvent { + + /** + * 存储与事件相关联的数据 + */ + private final JSONObject data; + + /** + * 创建一个新的自定义事件 + * + * @param source 事件源,表示触发此事件的对象 + * @param data 事件携带的数据,以JSON格式存储 + */ + public CustomEvent(Object source, JSONObject data) { + super(source); + this.data = data; + } + + /** + * 获取与此事件相关联的数据。 + * + * @return 包含事件数据的JSONObject + */ + public JSONObject getData() { + return data; + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java new file mode 100644 index 0000000..32115a6 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java @@ -0,0 +1,18 @@ +package com.muyu.event.process.basic; + +import org.springframework.context.ApplicationListener; + +/** + * @Author: zi run + * @Date 2024/9/29 21:29 + * @Description 事件监听基准 + */ +public interface EventListener extends ApplicationListener { + + /** + * 处理接收到的自定义事件。 + * + * @param event 已发布的自定义事件实例,包含事件的源和相关数据 + */ + void onEvent(CustomEvent event); +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java new file mode 100644 index 0000000..c23acf5 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java @@ -0,0 +1,39 @@ +package com.muyu.event.process.basic; + +import com.alibaba.fastjson2.JSONObject; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.stereotype.Component; + +/** + * @Author: zi run + * @Date 2024/9/29 22:01 + * @Description 事件发布者 + */ +@Component +public class EventPublisher implements ApplicationEventPublisherAware { + + /** + * 应用程序事件发布者,用于发布事件 + */ + private ApplicationEventPublisher applicationEventPublisher; + + /** + * 设置应用程序事件发布者。 + * + * @param applicationEventPublisher 应用程序事件发布者实例 + */ + @Override + public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + this.applicationEventPublisher = applicationEventPublisher; + } + + /** + * 发布自定义事件。 + * + * @param messages 事件携带的数据,以JSON格式传递 + */ + public void publishEvent(JSONObject messages) { + applicationEventPublisher.publishEvent(new CustomEvent(this, messages)); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java new file mode 100644 index 0000000..7b7913f --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java @@ -0,0 +1,19 @@ +package com.muyu.event.process.config; + +import com.muyu.event.process.listener.AddDatabaseListener; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Author: zi run + * @Date 2024/9/29 21:29 + * @Description 事件监听配置 + */ +@Configuration +public class EventListenerConfig { + + @Bean + public AddDatabaseListener addDatabaseListener() { + return new AddDatabaseListener(); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/TestConsumer.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/TestConsumer.java new file mode 100644 index 0000000..cd7dbe2 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/TestConsumer.java @@ -0,0 +1,52 @@ +package com.muyu.event.process.consumer; + +import cn.hutool.core.thread.ThreadUtil; +import com.alibaba.nacos.shaded.com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.Collection; + +/** + * @Author: zi run + * @Date 2024/9/29 16:53 + * @Description 测试消费者 + */ +@Slf4j +//@Component +@RequiredArgsConstructor +public class TestConsumer implements InitializingBean { + + /** + * kafka消费者 + */ + private final KafkaConsumer kafkaConsumer; + + /** + * kafka主题名称 + */ + private static final String topicName = "test-topic"; + + + @Override + public void afterPropertiesSet() throws Exception { + new Thread(() -> { + log.info("启动线程监听Topic: {}", topicName); + ThreadUtil.sleep(1000); + Collection topics = Lists.newArrayList(topicName); + kafkaConsumer.subscribe(topics); + while (true) { + ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(1000)); + consumerRecords.forEach(record -> { + String value = record.value(); + log.info("从Kafka中消费的原始数据: {}", value); + }); + } + }).start(); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java new file mode 100644 index 0000000..46aaeea --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java @@ -0,0 +1,82 @@ +package com.muyu.event.process.consumer; + +import cn.hutool.core.thread.ThreadUtil; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.nacos.shaded.com.google.common.collect.Lists; +import com.muyu.event.process.basic.EventPublisher; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: zi run + * @Date 2024/9/29 23:23 + * @Description 车辆消费者 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class VehicleConsumer implements InitializingBean { + + /** + * kafka消费者 + */ + private final KafkaConsumer kafkaConsumer; + + /** + * 事件发布者 + */ + private final EventPublisher eventPublisher; + + /** + * 协议解析报文传递数据(队列名称) + */ + public final static String MESSAGE_PARSING = "test-topic"; + +// @Override +// public void run(ApplicationArguments args) throws Exception { +// log.info("开始监听kafka-topic:{}", MESSAGE_PARSING); +// List topicList = Collections.singletonList(MESSAGE_PARSING); +// kafkaConsumer.subscribe(topicList); +// +// while (true) { +// ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(100)); +// consumerRecords.forEach(record -> { +// String value = record.value(); +// log.info("接收到车辆报文数据,内容:{}", value); +// eventPublisher.publishEvent(JSONObject.parseObject(value)); +// }); +// } +// } + + @Async + @Override + public void afterPropertiesSet() throws Exception { + new Thread(() -> { + log.info("启动线程监听Topic: {}", MESSAGE_PARSING); + ThreadUtil.sleep(100); + Collection topics = Lists.newArrayList(MESSAGE_PARSING); + kafkaConsumer.subscribe(topics); + while (true) { + ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(100)); + consumerRecords.forEach(consumerRecord -> { + String message = consumerRecord.value(); + log.info("接收到车辆报文数据,内容:{}", message); + eventPublisher.publishEvent(JSONObject.parseObject(message)); + }); + } + }).start(); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java new file mode 100644 index 0000000..c32feb1 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java @@ -0,0 +1,88 @@ +package com.muyu.event.process.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.muyu.common.core.constant.Constants; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.event.process.iotdb.service.TestIoTDBService; +import lombok.RequiredArgsConstructor; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Author: zi run + * @Date 2024/9/29 16:24 + * @Description 测试事件控制层 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/test-event") +public class TestEventController extends BaseController { + + /** + * kafka生产者 + */ + private final KafkaProducer kafkaProducer; + + /** + * kafka主题名称 + */ + private static final String kafkaTopicName = "test-topic"; + + /** + * 测试IoTDB业务层 + */ + private final TestIoTDBService testIoTDBService; + + /** + * 发送Kafka测试消息 + * + * @return 响应结果 + */ + @GetMapping(value = "/sendKafka") + public Result senKafka() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id",1); + jsonObject.put("name","张三"); + jsonObject.put("age",18); + jsonObject.put("sex","男"); + ProducerRecord producerRecord = new ProducerRecord<>(kafkaTopicName, jsonObject.toJSONString()); + kafkaProducer.send(producerRecord); + return Result.success(null, Constants.SUCCESS_MESSAGE); + } + + /** + * 查询IoTDB数据列表 + * @return 响应结果 + */ + @GetMapping(value = "/list") + public Result>> list() { + return Result.success(testIoTDBService.list(), Constants.SUCCESS_MESSAGE); + } + + /** + * 向IoTDB添加数据 + * + * @return 响应结果 + */ + @PostMapping(value = "/save") + public Result save() { + String deviceId = "root.test"; + ArrayList keyList = new ArrayList<>(); + ArrayList valueList = new ArrayList<>(); + keyList.add("car_vin"); + keyList.add("car_name"); + valueList.add("VIN123456"); + valueList.add("宝马"); + testIoTDBService.insertStringRecord(deviceId, System.currentTimeMillis(), keyList, valueList); + return Result.success(null, Constants.SUCCESS_MESSAGE); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/config/IoTDBSessionConfig.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/config/IoTDBSessionConfig.java similarity index 97% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/config/IoTDBSessionConfig.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/config/IoTDBSessionConfig.java index 01a498c..18e7feb 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/config/IoTDBSessionConfig.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/config/IoTDBSessionConfig.java @@ -1,4 +1,4 @@ -package com.muyu.event.process.basic.config; +package com.muyu.event.process.iotdb.basic.config; import lombok.extern.slf4j.Slf4j; import org.apache.iotdb.session.pool.SessionPool; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/IoTDBService.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/service/IService.java similarity index 97% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/IoTDBService.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/service/IService.java index 5c4ac01..fd5d3bf 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/IoTDBService.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/service/IService.java @@ -1,7 +1,7 @@ -package com.muyu.event.process.basic.service; +package com.muyu.event.process.iotdb.basic.service; -import com.muyu.event.process.domain.dto.IoTDbRecordAble; -import com.muyu.event.process.domain.dto.MeasurementSchemaValuesDTO; +import com.muyu.event.process.iotdb.domain.dto.IoTDbRecordAble; +import com.muyu.event.process.iotdb.domain.dto.MeasurementSchemaValuesDTO; import org.apache.iotdb.common.rpc.thrift.TAggregationType; import org.apache.iotdb.isession.SessionDataSet; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; @@ -14,9 +14,9 @@ import java.util.Map; /** * @Author: zi run * @Date 2024/9/28 23:37 - * @Description IoTDB业务层 + * @Description IoTDB基准业务层 */ -public interface IoTDBService { +public interface IService { /** * 插入一个 Tablet 对象到 IoTDB 数据库 diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/impl/IoTDBServiceImpl.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/service/impl/ServiceImpl.java similarity index 98% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/impl/IoTDBServiceImpl.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/service/impl/ServiceImpl.java index 73e67e2..bc355d9 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/service/impl/IoTDBServiceImpl.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/basic/service/impl/ServiceImpl.java @@ -1,11 +1,10 @@ -package com.muyu.event.process.basic.service.impl; +package com.muyu.event.process.iotdb.basic.service.impl; import com.alibaba.fastjson.JSON; -import com.muyu.event.process.basic.config.IoTDBSessionConfig; -import com.muyu.event.process.basic.service.IoTDBService; -import com.muyu.event.process.domain.dto.IoTDbRecordAble; -import com.muyu.event.process.domain.dto.MeasurementSchemaValuesDTO; -import lombok.RequiredArgsConstructor; +import com.muyu.event.process.iotdb.basic.config.IoTDBSessionConfig; +import com.muyu.event.process.iotdb.basic.service.IService; +import com.muyu.event.process.iotdb.domain.dto.IoTDbRecordAble; +import com.muyu.event.process.iotdb.domain.dto.MeasurementSchemaValuesDTO; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.iotdb.common.rpc.thrift.TAggregationType; @@ -17,6 +16,7 @@ import org.apache.iotdb.tsfile.read.common.RowRecord; import org.apache.iotdb.tsfile.write.record.Tablet; import org.apache.iotdb.isession.SessionDataSet; import org.apache.iotdb.tsfile.write.schema.MeasurementSchema; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.reflect.Type; @@ -26,17 +26,17 @@ import java.util.stream.Collectors; /** * @Author: zi run * @Date 2024/9/28 23:38 - * @Description IoTDB业务实现层 + * @Description IoTDB基准业务实现层 */ @Slf4j @Service -@RequiredArgsConstructor -public class IoTDBServiceImpl implements IoTDBService { +public class ServiceImpl implements IService { /** * IoTDB会话配置 */ - private final IoTDBSessionConfig ioTDBSessionConfig; + @Autowired + private IoTDBSessionConfig ioTDBSessionConfig; /** * 插入一个 Tablet 对象到 IoTDB 数据库 diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/DataJSON.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/DataJSON.java similarity index 93% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/DataJSON.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/DataJSON.java index 16853f3..fcd4aac 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/DataJSON.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/DataJSON.java @@ -1,4 +1,4 @@ -package com.muyu.event.process.domain; +package com.muyu.event.process.iotdb.domain; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/ResultEntity.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/ResultEntity.java similarity index 81% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/ResultEntity.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/ResultEntity.java index 02d7d96..ad159a6 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/ResultEntity.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/ResultEntity.java @@ -1,6 +1,6 @@ -package com.muyu.event.process.domain; +package com.muyu.event.process.iotdb.domain; -import com.muyu.event.process.domain.dto.IoTDbRecordAble; +import com.muyu.event.process.iotdb.domain.dto.IoTDbRecordAble; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/TestDataType.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/TestDataType.java similarity index 93% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/TestDataType.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/TestDataType.java index dd75553..eef2853 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/TestDataType.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/TestDataType.java @@ -1,4 +1,4 @@ -package com.muyu.event.process.domain; +package com.muyu.event.process.iotdb.domain; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/InsertDataDTO.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/InsertDataDTO.java similarity index 97% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/InsertDataDTO.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/InsertDataDTO.java index d213bd8..15b6cc2 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/InsertDataDTO.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/InsertDataDTO.java @@ -1,4 +1,4 @@ -package com.muyu.event.process.domain.dto; +package com.muyu.event.process.iotdb.domain.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/IoTDbRecordAble.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/IoTDbRecordAble.java similarity index 75% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/IoTDbRecordAble.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/IoTDbRecordAble.java index 957dfb5..5b8ad62 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/IoTDbRecordAble.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/IoTDbRecordAble.java @@ -1,4 +1,4 @@ -package com.muyu.event.process.domain.dto; +package com.muyu.event.process.iotdb.domain.dto; import lombok.Data; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/MeasurementSchemaValuesDTO.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/MeasurementSchemaValuesDTO.java similarity index 94% rename from cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/MeasurementSchemaValuesDTO.java rename to cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/MeasurementSchemaValuesDTO.java index 8681f19..f04a72b 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/domain/dto/MeasurementSchemaValuesDTO.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/domain/dto/MeasurementSchemaValuesDTO.java @@ -1,4 +1,4 @@ -package com.muyu.event.process.domain.dto; +package com.muyu.event.process.iotdb.domain.dto; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/IoTDBService.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/IoTDBService.java new file mode 100644 index 0000000..b473acf --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/IoTDBService.java @@ -0,0 +1,11 @@ +package com.muyu.event.process.iotdb.service; + +import com.muyu.event.process.iotdb.basic.service.IService; + +/** + * @Author: zi run + * @Date 2024/9/29 22:38 + * @Description IoTDB业务层 + */ +public interface IoTDBService extends IService { +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/TestIoTDBService.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/TestIoTDBService.java new file mode 100644 index 0000000..84302bd --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/TestIoTDBService.java @@ -0,0 +1,20 @@ +package com.muyu.event.process.iotdb.service; + +import com.muyu.event.process.iotdb.basic.service.IService; + +import java.util.List; +import java.util.Map; + +/** + * @Author: zi run + * @Date 2024/9/29 17:23 + * @Description 测试IoTDB业务层 + */ +public interface TestIoTDBService extends IService { + + /** + * 查询IoTDB数据列表 + * @return 返回结果 + */ + List> list(); +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/IoTDBServiceImpl.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/IoTDBServiceImpl.java new file mode 100644 index 0000000..3167618 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/IoTDBServiceImpl.java @@ -0,0 +1,14 @@ +package com.muyu.event.process.iotdb.service.impl; + +import com.muyu.event.process.iotdb.basic.service.impl.ServiceImpl; +import com.muyu.event.process.iotdb.service.IoTDBService; +import org.springframework.stereotype.Service; + +/** + * @Author: zi run + * @Date 2024/9/29 22:39 + * @Description IoTDB业务实现层 + */ +@Service +public class IoTDBServiceImpl extends ServiceImpl implements IoTDBService { +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/TestIoTDBServiceImpl.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/TestIoTDBServiceImpl.java new file mode 100644 index 0000000..21dde1d --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/iotdb/service/impl/TestIoTDBServiceImpl.java @@ -0,0 +1,33 @@ +package com.muyu.event.process.iotdb.service.impl; + +import com.muyu.event.process.iotdb.basic.service.impl.ServiceImpl; +import com.muyu.event.process.iotdb.service.TestIoTDBService; +import lombok.extern.slf4j.Slf4j; +import org.apache.iotdb.isession.SessionDataSet; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @Author: zi run + * @Date 2024/9/29 17:24 + * @Description 测试IoTDB业务实现层 + */ +@Slf4j +@Service +public class TestIoTDBServiceImpl extends ServiceImpl implements TestIoTDBService { + + /** + * 查询IoTDB数据列表 + * @return 返回结果 + */ + @Override + public List> list() { + String sql = "select * from root.test"; + SessionDataSet sessionDataSet = this.executeQueryStatement(sql); + List> list = this.packagingMapData(sessionDataSet, sessionDataSet.getColumnTypes()); + log.info("查询IoTDB数据为:{}", list.toString()); + return list; + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java new file mode 100644 index 0000000..1e0206a --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java @@ -0,0 +1,43 @@ +package com.muyu.event.process.listener; + +import com.alibaba.fastjson2.JSONObject; +import com.muyu.event.process.basic.CustomEvent; +import com.muyu.event.process.basic.EventListener; +import com.muyu.event.process.iotdb.basic.service.IService; +import com.muyu.event.process.iotdb.service.IoTDBService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: zi run + * @Date 2024/9/29 22:12 + * @Description 添加数据库事件监听器 + */ +public class AddDatabaseListener implements EventListener { + + /** + * IoTDB业务层 + */ + @Autowired + private IoTDBService ioTDBService; + + @Override + public void onEvent(CustomEvent event) { + JSONObject data = event.getData(); + List keyList = new ArrayList<>(); + List valueList = new ArrayList<>(); + data.forEach((key, value) -> { + keyList.add(key); + valueList.add((String) value); + }); + ioTDBService.insertStringRecord("root.vehicle", System.currentTimeMillis(), keyList, valueList); + } + + @Override + public void onApplicationEvent(CustomEvent event) { + onEvent(event); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml index 47bf553..f880532 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml @@ -42,4 +42,6 @@ spring: # 系统共享配置 - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} # 系统环境Config共享配置 - - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file + - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # kafka共享配置 + - application-kafka-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file From 3ebd1d2c3993d365cf710fea8d69e972f68e0a65 Mon Sep 17 00:00:00 2001 From: xinzirun Date: Mon, 30 Sep 2024 18:03:48 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix():=20=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=A4=84=E7=90=86=E5=9F=BA=E7=A1=80=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../muyu/event/process/basic/BasicEvent.java | 37 ++++++++ .../process/basic/BasicEventHandler.java | 37 ++++++++ .../process/basic/BasicEventListener.java | 16 ++++ .../muyu/event/process/basic/CustomEvent.java | 37 -------- .../event/process/basic/EventListener.java | 18 ---- .../event/process/basic/EventPublisher.java | 21 +++-- .../process/config/EventListenerConfig.java | 19 ---- .../process/consumer/VehicleConsumer.java | 89 +++++++++++-------- .../controller/TestEventController.java | 4 +- .../process/event/IoTDBInsertDataEvent.java | 20 +++++ .../process/listener/AddDatabaseListener.java | 43 --------- .../listener/IoTDBInsertDataListener.java | 68 ++++++++++++++ 12 files changed, 240 insertions(+), 169 deletions(-) create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEvent.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventHandler.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventListener.java delete mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java delete mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java delete mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/event/IoTDBInsertDataEvent.java delete mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java create mode 100644 cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/IoTDBInsertDataListener.java diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEvent.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEvent.java new file mode 100644 index 0000000..1701cba --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEvent.java @@ -0,0 +1,37 @@ +package com.muyu.event.process.basic; + +import org.springframework.context.ApplicationEvent; + +/** + * @Author: zi run + * @Date 2024/9/30 15:11 + * @Description 基础事件 + */ +public class BasicEvent extends ApplicationEvent { + + /** + * 事件携带的数据 + */ + private final T data; + + /** + * 构造函数,初始化事件源和数据 + * + * @param source 事件源对象 + * @param data 事件携带的数据 + */ + public BasicEvent(Object source, T data) { + super(source); + this.data = data; + } + + + /** + * 获取事件携带的数据 + * + * @return 事件数据 + */ + public T getData() { + return data; + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventHandler.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventHandler.java new file mode 100644 index 0000000..d9571d2 --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventHandler.java @@ -0,0 +1,37 @@ +package com.muyu.event.process.basic; + +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +/** + * @Author: zi run + * @Date 2024/9/30 15:37 + * @Description 基础事件处理器 + */ +@Component +public class BasicEventHandler implements ApplicationListener> { + + /** + * 具体事件监听器 + */ + private final BasicEventListener listener; + + /** + * 构造函数,用于注入具体事件监听器 + * + * @param listener 具体事件监听器 + */ + public BasicEventHandler(BasicEventListener listener) { + this.listener = listener; + } + + /** + * 处理应用事件 + * + * @param event 事件对象 + */ + @Override + public void onApplicationEvent(BasicEvent event) { + listener.onEvent(event); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventListener.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventListener.java new file mode 100644 index 0000000..7fecd6e --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/BasicEventListener.java @@ -0,0 +1,16 @@ +package com.muyu.event.process.basic; + +/** + * @Author: zi run + * @Date 2024/9/30 15:35 + * @Description 基础事件监听器 + */ +public interface BasicEventListener { + + /** + * 处理事件的方法 + * + * @param event 事件对象 + */ + void onEvent(BasicEvent event); +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java deleted file mode 100644 index 2b80585..0000000 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/CustomEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.muyu.event.process.basic; - -import com.alibaba.fastjson2.JSONObject; -import org.springframework.context.ApplicationEvent; - -/** - * @Author: zi run - * @Date 2024/9/29 21:19 - * @Description 自定义事件 - */ -public class CustomEvent extends ApplicationEvent { - - /** - * 存储与事件相关联的数据 - */ - private final JSONObject data; - - /** - * 创建一个新的自定义事件 - * - * @param source 事件源,表示触发此事件的对象 - * @param data 事件携带的数据,以JSON格式存储 - */ - public CustomEvent(Object source, JSONObject data) { - super(source); - this.data = data; - } - - /** - * 获取与此事件相关联的数据。 - * - * @return 包含事件数据的JSONObject - */ - public JSONObject getData() { - return data; - } -} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java deleted file mode 100644 index 32115a6..0000000 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.muyu.event.process.basic; - -import org.springframework.context.ApplicationListener; - -/** - * @Author: zi run - * @Date 2024/9/29 21:29 - * @Description 事件监听基准 - */ -public interface EventListener extends ApplicationListener { - - /** - * 处理接收到的自定义事件。 - * - * @param event 已发布的自定义事件实例,包含事件的源和相关数据 - */ - void onEvent(CustomEvent event); -} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java index c23acf5..b037cd2 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/basic/EventPublisher.java @@ -1,6 +1,5 @@ package com.muyu.event.process.basic; -import com.alibaba.fastjson2.JSONObject; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.stereotype.Component; @@ -16,24 +15,24 @@ public class EventPublisher implements ApplicationEventPublisherAware { /** * 应用程序事件发布者,用于发布事件 */ - private ApplicationEventPublisher applicationEventPublisher; + private ApplicationEventPublisher publisher; /** - * 设置应用程序事件发布者。 + * 设置应用程序事件发布者 * - * @param applicationEventPublisher 应用程序事件发布者实例 + * @param publisher 应用程序事件发布者实例 */ @Override - public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { - this.applicationEventPublisher = applicationEventPublisher; + public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { + this.publisher = publisher; } /** - * 发布自定义事件。 - * - * @param messages 事件携带的数据,以JSON格式传递 + * 发布事件 + * @param event 要发布的事件 + * @param 事件数据类型 */ - public void publishEvent(JSONObject messages) { - applicationEventPublisher.publishEvent(new CustomEvent(this, messages)); + public void publish(BasicEvent event) { + publisher.publishEvent(event); } } diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java deleted file mode 100644 index 7b7913f..0000000 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/config/EventListenerConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.muyu.event.process.config; - -import com.muyu.event.process.listener.AddDatabaseListener; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @Author: zi run - * @Date 2024/9/29 21:29 - * @Description 事件监听配置 - */ -@Configuration -public class EventListenerConfig { - - @Bean - public AddDatabaseListener addDatabaseListener() { - return new AddDatabaseListener(); - } -} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java index 46aaeea..9a688b4 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/consumer/VehicleConsumer.java @@ -1,24 +1,24 @@ package com.muyu.event.process.consumer; -import cn.hutool.core.thread.ThreadUtil; -import com.alibaba.fastjson2.JSONObject; -import com.alibaba.nacos.shaded.com.google.common.collect.Lists; import com.muyu.event.process.basic.EventPublisher; +import com.muyu.event.process.event.IoTDBInsertDataEvent; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; -import org.springframework.scheduling.annotation.Async; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextClosedEvent; import org.springframework.stereotype.Component; import java.time.Duration; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; /** * @Author: zi run @@ -28,7 +28,7 @@ import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor -public class VehicleConsumer implements InitializingBean { +public class VehicleConsumer implements ApplicationRunner, ApplicationListener { /** * kafka消费者 @@ -43,40 +43,51 @@ public class VehicleConsumer implements InitializingBean { /** * 协议解析报文传递数据(队列名称) */ - public final static String MESSAGE_PARSING = "test-topic"; + public final static String MESSAGE_PARSING = "MessageParsing"; -// @Override -// public void run(ApplicationArguments args) throws Exception { -// log.info("开始监听kafka-topic:{}", MESSAGE_PARSING); -// List topicList = Collections.singletonList(MESSAGE_PARSING); -// kafkaConsumer.subscribe(topicList); -// -// while (true) { -// ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(100)); -// consumerRecords.forEach(record -> { -// String value = record.value(); -// log.info("接收到车辆报文数据,内容:{}", value); -// eventPublisher.publishEvent(JSONObject.parseObject(value)); -// }); -// } -// } + /** + * 设定固定大小的线程池,线程数量与当前可用的处理器核心数相同 + */ + private final ExecutorService executorService = + Executors.newFixedThreadPool(10); - @Async @Override - public void afterPropertiesSet() throws Exception { - new Thread(() -> { - log.info("启动线程监听Topic: {}", MESSAGE_PARSING); - ThreadUtil.sleep(100); - Collection topics = Lists.newArrayList(MESSAGE_PARSING); - kafkaConsumer.subscribe(topics); - while (true) { - ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(100)); - consumerRecords.forEach(consumerRecord -> { - String message = consumerRecord.value(); - log.info("接收到车辆报文数据,内容:{}", message); - eventPublisher.publishEvent(JSONObject.parseObject(message)); - }); + public void run(ApplicationArguments args) throws Exception { + log.info("启动线程监听Topic: {}", MESSAGE_PARSING); + List topics = Collections.singletonList(MESSAGE_PARSING); + kafkaConsumer.subscribe(topics); + while (true) { + ConsumerRecords consumerRecords = kafkaConsumer.poll(Duration.ofMillis(100)); + consumerRecords.forEach(consumerRecord -> executorService.submit(() -> handleRecord(consumerRecord))); + } + } + + private void handleRecord(ConsumerRecord consumerRecord) { + String message = consumerRecord.value(); + log.info("接收到车辆报文数据,内容:{}", message); + log.info("------------------------------------------------"); + eventPublisher.publish(new IoTDBInsertDataEvent(this, message)); + } + + @Override + public void onApplicationEvent(ContextClosedEvent event) { + log.info("关闭线程池和Kafka消费者"); + + try { + executorService.shutdown(); + if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { + executorService.shutdownNow(); } - }).start(); + } catch (InterruptedException e) { + log.error("线程池关闭被中断,强制关闭", e); + executorService.shutdownNow(); + Thread.currentThread().interrupt(); + } + + try { + kafkaConsumer.close(); // 关闭Kafka消费者 + } catch (Exception e) { + log.error("关闭Kafka消费者时发生错误", e); + } } } diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java index c32feb1..bfc0dc3 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/controller/TestEventController.java @@ -50,9 +50,9 @@ public class TestEventController extends BaseController { @GetMapping(value = "/sendKafka") public Result senKafka() { JSONObject jsonObject = new JSONObject(); - jsonObject.put("id",1); + jsonObject.put("id","1"); jsonObject.put("name","张三"); - jsonObject.put("age",18); + jsonObject.put("age","18"); jsonObject.put("sex","男"); ProducerRecord producerRecord = new ProducerRecord<>(kafkaTopicName, jsonObject.toJSONString()); kafkaProducer.send(producerRecord); diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/event/IoTDBInsertDataEvent.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/event/IoTDBInsertDataEvent.java new file mode 100644 index 0000000..91d7d6e --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/event/IoTDBInsertDataEvent.java @@ -0,0 +1,20 @@ +package com.muyu.event.process.event; + +import com.muyu.event.process.basic.BasicEvent; + +/** + * @Author: zi run + * @Date 2024/9/29 21:19 + * @Description 向IoTDB插入数据事件 + */ +public class IoTDBInsertDataEvent extends BasicEvent { + + /** + * 构造函数,向IoTDB插入数据创建事件 + * + * @param messsge 消息 + */ + public IoTDBInsertDataEvent(Object source, String messsge) { + super(source, messsge); + } +} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java deleted file mode 100644 index 1e0206a..0000000 --- a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/AddDatabaseListener.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.muyu.event.process.listener; - -import com.alibaba.fastjson2.JSONObject; -import com.muyu.event.process.basic.CustomEvent; -import com.muyu.event.process.basic.EventListener; -import com.muyu.event.process.iotdb.basic.service.IService; -import com.muyu.event.process.iotdb.service.IoTDBService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; - -/** - * @Author: zi run - * @Date 2024/9/29 22:12 - * @Description 添加数据库事件监听器 - */ -public class AddDatabaseListener implements EventListener { - - /** - * IoTDB业务层 - */ - @Autowired - private IoTDBService ioTDBService; - - @Override - public void onEvent(CustomEvent event) { - JSONObject data = event.getData(); - List keyList = new ArrayList<>(); - List valueList = new ArrayList<>(); - data.forEach((key, value) -> { - keyList.add(key); - valueList.add((String) value); - }); - ioTDBService.insertStringRecord("root.vehicle", System.currentTimeMillis(), keyList, valueList); - } - - @Override - public void onApplicationEvent(CustomEvent event) { - onEvent(event); - } -} diff --git a/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/IoTDBInsertDataListener.java b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/IoTDBInsertDataListener.java new file mode 100644 index 0000000..0c0f96c --- /dev/null +++ b/cloud-modules/cloud-modules-event-process/src/main/java/com/muyu/event/process/listener/IoTDBInsertDataListener.java @@ -0,0 +1,68 @@ +package com.muyu.event.process.listener; + +import com.alibaba.fastjson2.JSONObject; +import com.muyu.event.process.basic.BasicEvent; +import com.muyu.event.process.basic.BasicEventListener; +import com.muyu.event.process.event.IoTDBInsertDataEvent; +import com.muyu.event.process.iotdb.service.IoTDBService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: zi run + * @Date 2024/9/29 22:12 + * @Description 向IoTDB插入数据事件监听器 + */ +@Component +@RequiredArgsConstructor +public class IoTDBInsertDataListener implements BasicEventListener { + + /** + * IoTDB业务层 + */ + private final IoTDBService ioTDBService; + + /** + * 设备名(表名) + */ + private static final String DEVICE_ID = "root.vehicle"; + + /** + * 处理接收到的事件,将数据插入到 IoTDB + * + * @param event 接收到的事件,包含需要插入的数据 + */ + @Override + public void onEvent(BasicEvent event) { + JSONObject data = JSONObject.parseObject(event.getData()); + List keyList = extractKeys(data); + List valueList = extractValues(data); + ioTDBService.insertStringRecord(DEVICE_ID, System.currentTimeMillis(), keyList, valueList); + } + + /** + * 从给定的JSONObject中提取所有的键 + * + * @param data 要提取键的JSONObject + * @return 键的列表 + */ + private List extractKeys(JSONObject data) { + return data.keySet().stream().collect(Collectors.toList()); + } + + /** + * 从给定的 JSONObject 中提取所有的值,并将其转换为字符串 + * + * @param data 要提取值的JSONObject + * @return 值的列表,以字符串形式表示 + */ + private List extractValues(JSONObject data) { + return data.values().stream() + .map(Object::toString) + .collect(Collectors.toList()); + } +} From 5203c69a904949f54ae47ad717dc877bcd8bd51e Mon Sep 17 00:00:00 2001 From: xinzirun Date: Mon, 30 Sep 2024 18:04:49 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix():=20=E4=BF=AE=E6=94=B9nacos=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-auth/src/main/resources/bootstrap.yml | 2 +- cloud-gateway/src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/bootstrap.yml | 2 +- .../cloud-modules-file/src/main/resources/bootstrap.yml | 2 +- .../cloud-modules-gen/src/main/resources/bootstrap.yml | 2 +- .../cloud-modules-system/src/main/resources/bootstrap.yml | 2 +- .../cloud-visual-monitor/src/main/resources/bootstrap.yml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cloud-auth/src/main/resources/bootstrap.yml b/cloud-auth/src/main/resources/bootstrap.yml index 270c8d6..2bdda14 100644 --- a/cloud-auth/src/main/resources/bootstrap.yml +++ b/cloud-auth/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev # Spring spring: application: diff --git a/cloud-gateway/src/main/resources/bootstrap.yml b/cloud-gateway/src/main/resources/bootstrap.yml index 5e54e71..4132cf0 100644 --- a/cloud-gateway/src/main/resources/bootstrap.yml +++ b/cloud-gateway/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev # Spring spring: diff --git a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml index 1f2e969..aed0523 100644 --- a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev spring: application: diff --git a/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml index f880532..0b653df 100644 --- a/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-event-process/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev spring: application: diff --git a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml index dd31e1b..eea6728 100644 --- a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev # Spring spring: diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml index 7619514..178e17b 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev # Spring spring: diff --git a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml index 296688a..9390135 100644 --- a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev spring: application: diff --git a/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml b/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml index f90fa0e..ddca326 100644 --- a/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml +++ b/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml @@ -6,7 +6,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: xzr + namespace: dev # Spring spring: