我们正在从 drools 版本 5.x 升级到 8.x 在尝试编译传统 DRT 语法时,基于条件的模板未按预期进行解析。 以下是场景。
template header
NOT_NULL_INDICATOR:Boolean
NULL_INDICATOR:Boolean
package xyz
import xyz
dialect 'mvel'
template "rule with all indicator false"
NOT_NULL_INDICATOR==false
NULL_INDICATOR==false
rule "Rule_@{RULE_GRP_ID}"
agenda-group "@{RULE_GRP_ID}"
auto-focus @{AUTO_FOCUS}
lock-on-active true
when
xyz
then
xyz
template "rule with all indicator true"
NOT_NULL_INDICATOR==true
NULL_INDICATOR==true
rule "Rule_@{RULE_GRP_ID}"
agenda-group "@{RULE_GRP_ID}"
auto-focus @{AUTO_FOCUS}
lock-on-active true
when
xyz
then
xyz
下面是生成DRL的java代码和输入Java对象。
PRDataProvider prDataProvider = new PRDataProvider(ruleSet.getPRList());
final DataProviderCompiler converter = new DataProviderCompiler();
InputStream inputStream = InterchangeRuleExecutorImpl.class.getResourceAsStream(drt);
String drl = converter.compile(prDataProvider, inputStream);
PR \[dataElement=XYZ, value=RDX, operation=EQUALS, ruleGrpId=500_28518_3722, autoFocus=true, mathOperationIndicator=false, feeCalculationPriority=0, fraud_fee=0.0, overridePriorityFlag=false, notNullIndicator=false, nullIndicator=false\]
PR \[dataElement=PQR, value=500, operation=EQUALS, ruleGrpId=500_28518_3724, autoFocus=false, mathOperationIndicator=false, feeCalculationPriority=0, fraud_fee=0.0, overridePriorityFlag=false, notNullIndicator=true, nullIndicator=true\]
我们在单个 DRT 文件中定义了多个模板,并且仅当满足给定模板的条件时才需要解析每个模板。预期的 DRL 是需要根据定义规则之前给出的条件输入(
NOT_NULL_INDICATOR
和 NULL_INDICATOR
)来解析模板。
目前,在 drools 升级之后,我们可以看到没有考虑该模板的条件,并且我们正在为每个 java 对象解析所有模板。
我该如何处理这种情况?
DRT 已被弃用,并且功能一直很少。我建议使用像 Freemarker 这样的模板引擎,或者只是以编程方式生成规则。这样您就可以使用条件语句来决定是否生成规则。