基于DMN实现IP规划匹配:FEEL表达式匹配CIDR与IP设命名
基于DMN的IP规划匹配方案问题解决
1. 修复FEEL语法错误(位运算&报错)
FEEL标准语法不支持位与运算符&,这是编译错误的核心原因。要实现IP与CIDR的匹配,直接使用FEEL内置的原生类型与运算符即可,完全符合DMN标准,不依赖任何特定实现:
替代表达式(标准FEEL)
ip-address(ip_str) in cidr(cidr_str)
- 说明:
ip-address(ip_str)将字符串格式的IP地址转换为FEEL原生IP类型cidr(cidr_str)将CIDR规则(如10.0.0.0/8)转换为FEEL的CIDR范围类型in运算符直接判断IP是否落在目标CIDR范围内,返回布尔值
将原BKM中的位运算逻辑替换为上述表达式,即可解决语法错误。
2. 解决决策表输入行重复问题
输入行重复通常由两个原因导致,对应修复方案:
- 条件组合不互斥:梳理所有CIDR规则,确保不同规则的范围无完全重叠(若业务允许重叠,需明确规则优先级),避免多个输入行使用完全一致的匹配条件
- 命中策略配置错误:将决策表的命中策略设置为
UNIQUE(要求唯一匹配)或PRIORITY(按规则顺序优先匹配),避免重复命中触发异常
3. 实现tDevices到tIPPlanLine的转换
要完成从设备列表到带命名规则的规划列表的转换,按以下步骤配置:
- 定义数据结构:
tDevices:列表类型,元素包含ip字段(字符串格式)tIPPlanRules:参考数据列表,元素包含cidr(CIDR规则字符串)和naming_rule(命名规范字符串)
- 复用BKM逻辑:将上述IP-CIDR匹配逻辑封装为BKM,作为可复用的判断函数
- 决策表或直接FEEL表达式处理:
若使用决策表,需将输入列绑定设备IP与规划规则,条件列调用BKM判断匹配,输出列返回对应命名规则;若需更简洁的处理,直接使用FEEL遍历表达式生成结果:
for device in tDevices return { ip: device.ip, naming_rule: single( for rule in tIPPlanRules if ip-address(device.ip) in cidr(rule.cidr) return rule.naming_rule ) }
- 说明:
single()函数确保每个IP仅返回一个命名规则,需提前保证CIDR规则无冲突或已设置优先级。
内容的提问来源于stack exchange,提问作者Nicolai
相关产品推荐
相关产品推荐

