前言
今天要要分享的要是紧接之前的设计:物联网设备流水入库TDengine改造方案,这里是具体的实现过程。这个是TDengine可自动扩展列方案,这个方案实现代码绝对是目前独家,关注我,你值得拥有。
一、整体思路
整体思路:消费信息 》》 数据转换 》》组织sql 》》orm框架自动配备数据源》》执行入库TDengine》》异常处理(扩展的核心)》》DDL执行扩列》》再次执行入库。。。。
这里大家应该可以猜到具体做法了,其实要不是因为这个列不固定,实现起来可简单多了,也可以用超级表,而且性能也会好很多。更重要的是可以用ORM框架,基本不用写啥sql。而且查询结果用实体接受数据,不会出现VARCHAR字段不能正确显示字符串的问题(我就是被这个坑了下)。 其实也可以用flink等消费信息,做入库处理,当然这样处理可就不能用ORM框架了,只能用经典的JDBC。
核心思路:根据设备上报数据,做插入数据转换sql,执行入库处理异常,根据异常做DDL操作,实现自动扩列,最后入库。上报的数据:json串做数据转换,数据值做反射获取类型,转换为对应的扩列sql执行、组织入库sql。
二、实现流程图
我的整体环境:SpringBoot3 + mybatisPlus + 双数据源(mysql、TDengine)+ 集成kafka
消费上游平台放入kafka的信息,然后走以上流程,目标执行入库TDengine。
三、核心代码
这里的整体框架我之前的博文有写,并且是公开独家分享到csdn的gitCode:gitcode.net/zwrlj527/da…
1.引入库
xml
复制代码
<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency>
2.配置文件
ymal
复制代码
spring: #kafka配置 kafka: #bootstrap-servers: 192.168.200.72:9092,192.168.200.73:9092 #bootstrap-servers: 192.168.200.83:9092,192.168.200.84:9092 bootstrap-servers: localhost:9092 client-id: dc-device-flow-analyze consumer: group-id: dc-device-flow-analyze-consumer-group max-poll-records: 10 #Kafka中没有初始偏移或如果当前偏移在服务器上不再存在时,默认区最新 ,有三个选项 【latest, earliest, none】 auto-offset-reset: earliest #是否开启自动提交 enable-auto-commit: false #自动提交的时间间隔 auto-commit-interval: 1000 listener: ack-mode: MANUAL_IMMEDIATE concurrency: 1 #推荐设置为topic的分区数 type: BATCH #开启批量监听 #消费topic配置 xiaotian: analyze: device: flow: topic: consumer: device-flow
3.kafka消费监听
java
复制代码
package com.xiaotian.datagenius.kafka; import com.xiaotian.datagenius.service.DataTransService; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.support.Acknowledgment; import org.springframework.stereotype.Component; import java.util.List; /** * 消费者listener * * @author zhengwen **/ @Slf4j @Component public class KafkaListenConsumer { @Autowired private DataTransService dataTransService; /** * 设备流水listenner * * @param records 消费信息 * @param ack Ack机制 */ @KafkaListener(topics = "${easylinkin.analyze.device.flow.topic.consumer}") public void deviceFlowListen(List<ConsumerRecord> records, Acknowledgment ack) { log.debug("=====设备流水deviceFlowListen消费者接收信息===="); try { for (ConsumerRecord record : records) { log.debug("---开启线程解析设备流水数据:{}", record.toString()); dataTransService.deviceFlowTransSave(record); } } catch (Exception e) { log.error("----设备流水数据消费者解析数据异常:{}", e.getMessage(), e); } finally { //手动提交偏移量 ack.acknowledge(); } } }
4.消息具体处理方法(实现)
java
复制代码
package com.xiaotian.datagenius.service.impl; import cn.hutool.core.collection.CollectionUtil; im