Actor按照层级组织:
App Actor:根Actor,负责管理所有租户Actor
Tenant Actor:管理租户下的设备和规则链Actor
Device Actor:维护设备状态(活跃会话、订阅、待处理RPC命令等)
Rule Chain Actor:处理传入消息并分发给规则节点Actor
Rule Node Actor:处理消息并将结果返回给规则链Actor
Actor消息流程图:
Actor消息处理流程说明:
(1)DefaultTbRuleEngineConsumerService是处理规则引擎消息的消费者服务类。
其关键方法有:
init
onTbApplicationEvent
handleNotification
updateQueues / deleteQueues
handleComponentLifecycleEvent
createConsumer (调用TbRuleEngineQueueConsumerManager.create)
removeConsumer
MainQueueConsumerManager.launchConsumer()方法,做为消费者,接收来自Transport的消息,并将消息推送到Actor系统上下文ActorSystemContext中。
(参见Mark-20250101-1)
(2)ActorSystemContext把数据发送到根Actor(AppActor)的邮箱中,AppActor从邮箱中收到消息然后通过process方法进行处理,根据消息类型,会找到对应设备的TenantActor并将消息投递到对应邮箱中。
(3)TenantActor从邮箱中取到数据并通过process方法进行处理,首先找到TenantAcotr绑定的RootChainActor,并将消息投递到RuleChainActor对应的TbActorMailbox。
(4)RuleChainActor从邮箱中取到数据之后通过process方法将消息推送给它的RuleChainActorMessageProcessor进行处理。
(5)RuleChainActorMessageProcessor接收到数据之后,会先确认有没有指定处理的node,如果没有就将其给到这个RuleChain对应的第一个RuleNodeActor进行处理。
(6)RuleNodeActor从邮箱中收到消息之后会通过process方法,将数据发到RuleNodeActorMessageProcessor进行进一步的处理。
(7)RuleNodeActorMessageProcessor会将消息丢给TbNode的实现类进行数据的最后处理。
(8)TbNode的实现类处理完之后会调用DefaultTbContext,告知处理结果,然后会根据返回结果重新拼装消息,并将消息传递回RuleChainActor。
(9)RuleChainActor接收到消息,由于消息类型发生了变更,所有会调用其对应的RuleChainActorMessageProcessor的onTellNext方法进行下一步处理。
(10)RuleChainActorMessageProcessor会根据rule node的关联关系找到下一个处理消息的RuleNodeActor;如果当没有找到则说明当前消息已经处理完毕,如果可以找到则把当前消息推送到pushToTarget()。
(11)服务下一个target的类型是RULE_NODE则将消息发送给它,如果是RULE_CHAIN则重新组装消息,并通知RuleChainActor对应的TenantActor进行处理。
(12)TenantActor收到来自RuleChainActor发来的消息之后会寻找下一个RuleChainActor来处理消息。
到此,一个完整流程结束。