简介:
本次主要是对thingsboard的源码进行一个简单的分析,从设备发送遥测数据到平台的角度跟进后端代码逻辑探究其流转过程,好了,话不多说,直接进入正题。
数据流转大概流程
找到MqttTransportService类==》通过@PostConstruct注解在项目启动后进入init()方法
==》里面绑定了MqttTransportServerInitializer类即mqtt服务初始化
==》MqttTransportServerInitializer类继承ChannelInitializer类重写了initChannel方法
==》initChannel方法里绑定了MqttTransportHandler
==》进入MqttTransportHandler的channelRead方法,验证消息类型为mqtt时转入processMqttMsg方法
==》processMqttMsg里进行判断:消息类型为连接时转入processConnect,设备session为临时的转入processProvisionSessionMsg
否则转入enqueueRegularSessionMsg方法,这里先探讨转入enqueueRegularSessionMsg
==》转入enqueueRegularSessionMsg后调用processMsgQueue将消息投递到队列
==》跟进去发现里面调用了processRegularSessionMsg方法
==》processRegularSessionMsg里根据消息的类型进行转发,比如:发布,订阅,取消订阅,取消连接等等
==》跟进PUBLISH,转入processPublish方法
==》转入processDevicePublish,进入发现这里根据消息的主题进行转发,这里选择isDeviceTelemetryTopic对应的transportService.process接口实现
==》发现这里对消息封装了一下之后转入sendToRuleEngine,将消息发送到规则链
》继续跟进进入sendToRuleEngine,发现调用ruleEngineMsgProducer.send,即将消息通过生产者发送到队列
这里对应多个实现,例如:inMemory,Kafka,RabbitMQ等等,默认发送到inMemory内存
》有生产者那肯定有消费者,我们找到DefaultTbRuleEngineConsumerService核心消费者
》找到launchMainConsumers方法》launchConsumer》consumerLoop
》发现consumerLoop是个循环,将消息取出来消费,转submitMessage方法
》然后转入forwardToRuleEngineActor》调用actorContext.tell,这里开始就是Actor模型流转了,不清楚的可以去百度搜索一下
》首先调用appActor.tell通过根appActor调用tell方法转入enqueue方法,里面对消息进行了分类,分为高优先级和正常消息队列
还有initActor()方法创建一系列actor,大概流程:AppActor》TenantActor》RuleChainActor》RuleNodeActor,我们先转入tryProcessQu

本文深入剖析了ThingsBoard平台中设备遥测数据的流转过程,从MqttTransportService类出发,详细介绍了数据如何从设备传递至规则链并最终被处理。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



