java - 如何从java中的drools规则文件访问变量而不将它们声明为全局变量?

标签 java drools

我正在开发一个使用以下规则文件的应用程序。有没有一种方法可以获取 boolean 变量 b1b2b3 的值,而无需将它们声明为全局变量?

Drools 文件

rule ruleone

when
$fact : AppFact( name == "abcd")

then
boolean b1= $fact.id[422] && $fact.id[423]  &&  $fact.id[372]  &&  $fact.ruleId[373];
boolean b2= b1 && $fact.id[272];
boolean b3= b1 && $fact.id[273];


end

最佳答案

从我的头脑中,我可以想到两个简单的解决方案:

使用单一全局服务

声明一个可用于通知这些 boolean 值的全局服务。如果您担心 DRL 中有大量全局变量,这会很方便。

global MyService service;

rule ruleone
when
    $fact : AppFact( name == "abcd")
then
    boolean b1= $fact.id[422] && $fact.id[423]  &&  $fact.id[372]  && $fact.ruleId[373];
    boolean b2= b1 && $fact.id[272];
    boolean b3= b1 && $fact.id[273];

    service.notifyValues(b1, b2, b3);
end

这将使 boolean 值可用于您配置为服务的任何对象。

使用事实和查询

这种方法的想法是将 boolean 值作为事实插入(包装在对象中),然后使用查询从 session 中提取它们。

rule ruleone
when
    $fact : AppFact( name == "abcd")
then
    boolean b1= $fact.id[422] && $fact.id[423]  &&  $fact.id[372]  && $fact.ruleId[373];
    boolean b2= b1 && $fact.id[272];
    boolean b3= b1 && $fact.id[273];

    insert(new Result(b1, b2, b3));
end

query getResults()
    $r: Result()
end

为了更好地了解查询,请参阅 Drools' documentation .

希望对你有帮助

关于java - 如何从java中的drools规则文件访问变量而不将它们声明为全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40624641/

相关文章:

java - 为什么这些 Java 枚举会改变值?

java - Optaplanner/Drools 在solverFactory.buildSolver() 中抛出异常

java - drools 包名称(Fluent api)

java - 流口水规则流程

java - 当设置为 1 时,为什么我的 2 个 JButton 占用 2 个空格(网格宽度)?

java - Hibernate xml 映射列表按日期排序

Java 惰性求值语义

java - 将值从一个非静态方法传递到另一个主方法?

java - 我怎样才能在 drools 中获得动态属性

java - Drools 中的 `Unable to find class` 错误