|
@@ -67,6 +67,27 @@ func (r *RuleChainActor) Process(msg protocol.ActorMsg) error {
|
|
return r.onTellNextRuleNode(msg.(*ruleEngine.RuleNodeToRuleChanTellNextMsg))
|
|
return r.onTellNextRuleNode(msg.(*ruleEngine.RuleNodeToRuleChanTellNextMsg))
|
|
case protocol.RULE_CHAIN_TO_RULE_CHAIN_MSG:
|
|
case protocol.RULE_CHAIN_TO_RULE_CHAIN_MSG:
|
|
return r.onRuleChainToRuleChain(msg.(*ruleEngine.RuleChainToRuleChainMsg))
|
|
return r.onRuleChainToRuleChain(msg.(*ruleEngine.RuleChainToRuleChainMsg))
|
|
|
|
+ case protocol.COMPONENT_LIFE_CYCLE_MSG:
|
|
|
|
+ return r.onComponentLifeCycleMsg(msg.(*ruleEngine.ComponentLifecycleMsg))
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// TODO:生命周期事件写入数据库
|
|
|
|
+func (r *RuleChainActor) onComponentLifeCycleMsg(msg *ruleEngine.ComponentLifecycleMsg) error {
|
|
|
|
+ server.Log.Debugf("%s,%s,%s onComponentLifecycleMsg", msg.TenantId, msg.EntityId.GetEntityType(), msg.EntityId.GetId())
|
|
|
|
+ switch msg.EventType {
|
|
|
|
+ case ruleEngine.CREATED:
|
|
|
|
+ return r.start()
|
|
|
|
+ case ruleEngine.UPDATED:
|
|
|
|
+ return r.update()
|
|
|
|
+ case ruleEngine.ACTIVATED:
|
|
|
|
+ return r.restart()
|
|
|
|
+ case ruleEngine.DELETED:
|
|
|
|
+ _ = r.stop()
|
|
|
|
+ return r.Ctx.Stop(r.ruleChainId)
|
|
|
|
+ default:
|
|
|
|
+
|
|
}
|
|
}
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -247,7 +268,7 @@ func (r *RuleChainActor) start() error {
|
|
}
|
|
}
|
|
r.started = true
|
|
r.started = true
|
|
}
|
|
}
|
|
- r.initRoutes(r.ruleChain, nodes)
|
|
|
|
|
|
+ return r.initRoutes(r.ruleChain, nodes)
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
return r.update()
|
|
return r.update()
|
|
@@ -255,15 +276,104 @@ func (r *RuleChainActor) start() error {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
-func (r *RuleChainActor) initRoutes(ruleChain *ruleEngine.RuleChain, nodes []*ruleEngine.RuleNode) {
|
|
|
|
|
|
+func (r *RuleChainActor) update() error {
|
|
|
|
+ ruleChain, err := r.SystemCtx.RuleChainService.FindRuleChainById(r.tenantId, r.ruleChainId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ if ruleChain == nil {
|
|
|
|
+ return errors.New(fmt.Sprintf("rule chain not found :%s", r.ruleChainId))
|
|
|
|
+ }
|
|
|
|
+ // 查询链上的所有节点
|
|
|
|
+ nodes, err := r.SystemCtx.RuleChainService.GetRuleChainNodes(r.tenantId, r.ruleChainId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ for _, v := range nodes {
|
|
|
|
+ // 如果找不到节点actor,则创建
|
|
|
|
+ if actor, ok := r.nodeActors[v.RuleNodeId]; !ok {
|
|
|
|
+ server.Log.Debugf("creating rule node actor:%s", v.RuleNodeId)
|
|
|
|
+ ref, err := r.createNodeActor(v.RuleNodeId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ r.nodeActors[v.RuleNodeId] = &ruleEngine.RuleNodeCtx{
|
|
|
|
+ TenantId: r.tenantId,
|
|
|
|
+ ChainActor: r.Ctx,
|
|
|
|
+ SelfActor: ref,
|
|
|
|
+ Self: v,
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // 传递消息到node actor
|
|
|
|
+ server.Log.Debugf("updating rule node actor:%s", v.RuleNodeId)
|
|
|
|
+ actor.Self = v
|
|
|
|
+ actor.SelfActor.TellWithHighPriority(&ruleEngine.ComponentLifecycleMsg{
|
|
|
|
+ TenantId: r.tenantId,
|
|
|
|
+ EntityId: &entities.RuleNodeId{Id: v.RuleNodeId},
|
|
|
|
+ EventType: ruleEngine.UPDATED,
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var removeNodes []string
|
|
|
|
+ // 对比已经有节点和最新节点列表,找出差集,并移除
|
|
|
|
+ for k := range r.nodeActors {
|
|
|
|
+ var found = false
|
|
|
|
+ for _, v := range nodes {
|
|
|
|
+ if v.RuleNodeId == k {
|
|
|
|
+ found = true
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if !found {
|
|
|
|
+ removeNodes = append(removeNodes, k)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // remove actors
|
|
|
|
+ for _, v := range removeNodes {
|
|
|
|
+ server.Log.Debugf("remove rule node :%s", v)
|
|
|
|
+ if ref, ok := r.nodeActors[v]; ok {
|
|
|
|
+ ref.SelfActor.TellWithHighPriority(&ruleEngine.ComponentLifecycleMsg{
|
|
|
|
+ TenantId: r.tenantId,
|
|
|
|
+ EntityId: &entities.RuleNodeId{Id: v},
|
|
|
|
+ EventType: ruleEngine.DELETED,
|
|
|
|
+ })
|
|
|
|
+ delete(r.nodeActors, v)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return r.initRoutes(r.ruleChain, nodes)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (r *RuleChainActor) restart() error {
|
|
|
|
+ if err := r.stop(); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ if err := r.start(); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (r *RuleChainActor) stop() error {
|
|
|
|
+ server.Log.Debugf("stopping rule chain with %d nodes, tenantId:%s, entityId:%s", len(r.nodeActors), r.tenantId, r.ruleChainId)
|
|
|
|
+ for actorId := range r.nodeActors {
|
|
|
|
+ err := r.Ctx.Stop(actorId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ r.started = false
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (r *RuleChainActor) initRoutes(ruleChain *ruleEngine.RuleChain, nodes []*ruleEngine.RuleNode) error {
|
|
for _, node := range nodes {
|
|
for _, node := range nodes {
|
|
relations, err := r.SystemCtx.RuleChainService.GetRuleNodeRelations(r.tenantId, node.RuleNodeId)
|
|
relations, err := r.SystemCtx.RuleChainService.GetRuleNodeRelations(r.tenantId, node.RuleNodeId)
|
|
if err != nil {
|
|
if err != nil {
|
|
- continue
|
|
|
|
|
|
+ return err
|
|
}
|
|
}
|
|
var rs []*ruleEngine.RuleNodeRelation
|
|
var rs []*ruleEngine.RuleNodeRelation
|
|
for _, relation := range relations {
|
|
for _, relation := range relations {
|
|
-
|
|
|
|
rs = append(rs, &ruleEngine.RuleNodeRelation{
|
|
rs = append(rs, &ruleEngine.RuleNodeRelation{
|
|
In: &entities.RuleNodeId{Id: node.RuleNodeId},
|
|
In: &entities.RuleNodeId{Id: node.RuleNodeId},
|
|
Out: &entities.RuleNodeId{Id: relation.To},
|
|
Out: &entities.RuleNodeId{Id: relation.To},
|
|
@@ -272,13 +382,9 @@ func (r *RuleChainActor) initRoutes(ruleChain *ruleEngine.RuleChain, nodes []*ru
|
|
}
|
|
}
|
|
r.nodeRoutes[node.RuleNodeId] = rs
|
|
r.nodeRoutes[node.RuleNodeId] = rs
|
|
}
|
|
}
|
|
- fmt.Printf("%+v", r.nodeRoutes)
|
|
|
|
r.firstId = ruleChain.FirstNodeId
|
|
r.firstId = ruleChain.FirstNodeId
|
|
r.firstNode = r.nodeActors[r.firstId]
|
|
r.firstNode = r.nodeActors[r.firstId]
|
|
r.state = ruleEngine.ACTIVE
|
|
r.state = ruleEngine.ACTIVE
|
|
-}
|
|
|
|
-
|
|
|
|
-func (r *RuleChainActor) update() error {
|
|
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|