关于规则引擎执行中断恢复
# 关于规则引擎执行中断恢复
某些场景下需要规则引擎执行实例中断后恢复,例如:
- 工作流审批场景: 在需要人工审批的工作流程中,规则引擎的执行可能需要暂停,直到获得必要的批准。
- 第三方系统异步回调: 在依赖外部系统响应的场景中,规则引擎可能需要等待第三方系统的回调来继续执行。
- 依赖服务不可用: 当规则引擎的执行依赖于外部服务(如数据库、消息队列等),而这些服务暂时不可用时,规则引擎的执行将被中断。
以上要求规则引擎中断恢复场景,又不想引入工作流,RuleGo
是一个不错的轻量级方案。RuleGo
提供无状态的接口,
支持规则引擎执行中断恢复,即当规则引擎执行中断时,可以恢复到中断前的状态。
以下是具体步骤:
- 通过规则引擎上下文
ctx.DoOnEnd
让本次执行实例中断,自定义节点处理或者Functions
节点都可以操作上下文。
func OnMsg(ctx types.RuleContext, msg types.RuleMsg)
//处理逻辑
//让本次执行实例执行中断,不执行后续节点,并把当前节点数据通知`OnEnd`回调函数
ctx.DoOnEnd(msg RuleMsg, err error, relationType string)
}
1
2
3
4
5
2
3
4
5
- 注册规则引擎执行结束回调函数持久化msg以及相关状态(如果需要):WithOnEnd。
ruleEngine.OnMsg(msg, types.WithOnEnd(func(ctx types.RuleContext, msg types.RuleMsg, err error, relationType string) {
//持久化当前中断节点数据
//ctx.GetSelfId() 当前节点ID,用于恢复
//msg.Id本次执行实例消息ID
//msg.Data本次执行实例消息数据
//msg.Type本次执行实例消息类型
//msg.Metadata本次执行实例消息元数据
//err.Error()本次执行实例错误信息
//relationType查找下一个节点的关系
}))
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 恢复执行,提供上次中断保存的msg、中断节点ID,以及指定
relationType
查询下一个节点恢复执行。
ruleEngine.OnMsg(msg, types.WithTellNext(fromNodeId string, relationTypes ...string))
1
在 GitHub 上编辑此页 (opens new window)
上次更新: 2024/10/23, 10:13:01