Activation Group与Salience异常:错误规则触发问题排查
规则触发异常排查问题
当前系统包含以下3条规则,现有事实可匹配全部规则。根据salience(优先级)与activation-group(激活组)设置,预期应触发规则10或11,但实际两台系统始终触发规则12,仅一台系统符合预期。
规则代码
rule "dimensionConfigMotorTubeDefault_10" salience 390 activation-group "ag_R238_r28-wirefree" no-loop true lock-on-active true when p: Product(sku != 1) $mm : InventoryChoiceOption(sku == "mm") exists (NII(internalPattern in ("R238")) from $mm.value) $opt : TextChoiceOption(sku == "motorControl") exists (OptionValue(optionValueValue in ("r28-wirefree")) from $opt.value) DimensionOption(sku == "dim", widthValue <= "72", heightValue <= "120") $edi : TextOption(sku == "default_tube_size") then $edi.setValue("1.5"); update($edi); end rule "dimensionConfigMotorTubeDefault_11" salience 390 activation-group "ag_R238_r28-wirefree" no-loop true lock-on-active true when p: Product(sku != 1) $mm : InventoryChoiceOption(sku == "mm") exists (NII(internalPattern in ("R238")) from $mm.value) $opt : TextChoiceOption(sku == "motorControl") exists (OptionValue(optionValueValue in ("r28-wirefree")) from $opt.value) DimensionOption(sku == "dim", widthValue <= "96", heightValue <= "96") $edi : TextOption(sku == "default_tube_size") then $edi.setValue("1.5"); update($edi); end rule "dimensionConfigMotorTubeDefault_12" salience 380 activation-group "ag_R238_r28-wirefree" no-loop true lock-on-active true when p: Product(sku != 1) $mm : InventoryChoiceOption(sku == "mm") exists (NII(internalPattern in ("R238")) from $mm.value) $opt : TextChoiceOption(sku == "motorControl") exists (OptionValue(optionValueValue in ("r28-wirefree")) from $opt.value) DimensionOption(sku == "dim", widthValue <= "102", heightValue <= "120") $edi : TextOption(sku == "default_tube_size") then $edi.setValue("2"); update($edi); end
可能的原因分析
- 字符串数值比较逻辑错误:规则中
widthValue和heightValue以字符串类型进行大小比较(如<= "72"),但字符串比较是按字典序执行的。例如"100"会被判定为小于"72"(首字符'1'的ASCII码小于'7')。若两台异常系统中DimensionOption的宽高值存储为字符串类型,而正常系统使用数值类型,就会导致规则10/11的条件不满足,转而触发规则12。 - 规则加载/编译顺序差异:尽管规则设置了相同的salience,但Drools在salience相同的规则中,可能会按加载顺序选择触发规则。如果异常系统中规则12先被加载,且规则10/11的条件匹配未被正确识别,就会优先触发规则12。
- 事实对象属性值格式不一致:两台异常系统中的DimensionOption实例宽高值可能存在格式差异(如带空格、额外字符),导致规则10/11的条件不匹配,而规则12的宽松条件满足。例如实际widthValue为
" 72"(带前导空格),字符串比较时" 72">"72",无法匹配规则10的条件,但符合规则12的<= "102"。 - Drools版本差异:不同系统使用的Drools版本可能不同,新版本对activation-group和salience的处理逻辑有调整,导致规则触发优先级不符合预期。部分旧版本中,activation-group内的规则触发可能不完全严格遵循salience,会结合其他因素判断。
- lock-on-active的交互影响:
lock-on-active设为true时,规则触发后会锁定激活组内的其他规则。若异常系统中规则12因某种原因先进入议程并触发,就会阻止规则10/11的执行。这可能是因为规则12的条件匹配被提前检测到,而规则10/11的匹配检测存在延迟。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

