Drools 多个修改语句与单个修改语句

标签 drools

如果我有一个修改语句与多个修改语句(如下所示),Drools 重新考虑要触发的新一批规则的方式有什么区别

rule "Multiple Modify Statements"
    dialect "mvel"
    when
        $m : Message( status == Message.HELLO )
    then
        modify ( $m ) { message = "Hope" };
        modify ( $m ) { status = Message.GOODBYE };
end

rule "Single Modify Statements"
    dialect "mvel"
    when
        $m : Message( status == Message.HELLO )
    then
        modify ( $m ) { message = "Never Give Up",
                       status = Message.GOODBYE };
end

并且,是否有任何性能影响。

实际上,我们正在尝试创建一个 Excel 决策表,每列都有操作,因此多个修改语句更可取,因为这些语句可以由 Excel 文件中的多个列表示。

高度赞赏任何见解。

最佳答案

有趣的问题。

Drools 中规则的 RHS 被编译成 Java 类。如果您查看示例中生成的类,您将看到以下内容:

当使用 2 个修改语句时,会生成以下代码:

$m.setMessage("Hope");
update($m);
$m.setStatus(Message.GOODBYE);
update($m);

现在,当使用单个修改语句时,生成的代码如下所示:

$m.setMessage("Hope");
$m.setStatus(Message.GOODBYE);
update($m);

区别在于调用方法update的次数。此方法会触发与 Message 类相关的任何条件的评估。

我假设使用单个修改时会带来某种性能优势,但我无法向您保证这种优势是否明显。我想您唯一的选择是准备基准测试,以便您可以自己测量性能增益(如果有)。

希望对你有帮助

关于Drools 多个修改语句与单个修改语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38159269/

相关文章:

jakarta-ee - Drools 融合和 Java EE

java - Drools DRL 中的对象传递问题

java - 按多个属性对对象内的列表进行分组 : Java 8

包上的 Drools DRL 文件无法读取

java - 带有流口水的正则表达式(特殊字符/*)

java - 议程组在 Drools 中未按预期工作

java - 需要 Drools 项目创意

用于动态验证规则的 Java API

java - 在 Drools 声明类型中包含函数

java - Drools Execution,获取撤回数量