ae74b4752a041baa2de3de3d67f891d643705c04
rule 模块 engine/ 新增 14 个核心类 + 4 个测试: - RuleEngine / DefaultRuleEngine:对外入口,链级 try-catch 隔离(决议 #3) - DagExecutor:BFS 遍历,按 relation_type 选 outgoing links,RuntimeException 转 FAILURE - ChainIndex:三层绑定(subsystem/product/device)4 种 key 匹配 + LinkedHashMap 去重 + priority ASC 排序 - RuleChainCompiler:DO → CompiledRuleChain,含单 Trigger + DAG 无环 + 非法枚举兜底 - NodeProvider / NodeProviderRegistry:SPI + Spring @Component 路由(禁用 ServiceLoader/@SPI) - RuleContext / NodeResult / CompiledRuleChain/Node/Link / RuleEngineResult / RuleChainException 测试覆盖(42/42 全绿): - DagExecutorTest: 线性链 / 分支(TRUE/FALSE)/ 并行动作 / 异常转 FAILURE / metadata 传递 / SKIP 截断 / 缺 Trigger - ChainIndexTest: 4 种 wildcard 组合 / 去重 / priority 排序 / 租户隔离 / evict - RuleChainCompilerTest: 正常编译 / 单 Trigger 兜底 / DAG 无环 / 非法 category & relation_type / 连线 sortOrder - DefaultRuleEngineTest: 链级异常隔离(chain1+chain3 成功,chain2 失败,counters 各 1 次) 补齐依赖: - rule/pom.xml 加 io.micrometer:micrometer-core(节点执行 Timer + 失败 Counter) - RuleNodeCategory 加 of(String) 静态查找方法(配合 RuleLinkRelationType.of 一致风格) Known Pitfalls 落地: ⚠️ 评审 B1:ShakeLimit 节点 hook 留在 DagExecutor(B48 补) ⚠️ 评审 B3:LinkedHashMap 去重保留顺序(ChainIndex.match) ⚠️ 评审 B4:relation_type 严格封闭 6 值(RuleLinkRelationType + isValid) ⚠️ 评审 A5:chains 顺序 for 循环 + try-catch;不使用 Reactor flatMap 并发 ⚠️ 评审 B10:单 Trigger 兜底在 Compiler 层(Service 层 + Compiler 双重保障) ⚠️ Metrics 基数:tag 含 chainId + nodeType + outcome;规则链 ≤ 500 控制 ⚠️ DAG 兜底 MAX_NODES_PER_EXECUTION=1000 防脏数据绕过无环校验 未实现(留给后续任务): - 具体 Provider(B4/B5/B6 Trigger/Condition/Action 实现) - 全量缓存加载 + Pub/Sub 驱逐(B8) - JMH Benchmark(任务卡 §6.4 + AC9 p99 < 50ms,第二期补) - @SpringBootTest 集成测试(B9 Handler 就位后补) Co-Authored-By: Claude Opus 4.7 (1M context, main session) <noreply@anthropic.com>
Description
Languages
Java
80.2%
PLpgSQL
12.7%
TSQL
6.7%
Python
0.2%