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

时间:2016-11-16 05:25:41

标签: java drools

我正在开发一个使用以下规则文件的应用程序。有没有办法让我可以得到布尔变量b1b2b3的值而不将它们声明为全局?

Drools file

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

1 个答案:

答案 0 :(得分:1)

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

使用单一全球服务

声明可用于通知这些布尔值的单个全局服务。如果你担心你的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

这将使布尔值可用于您配置为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];

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

query getResults()
    $r: Result()
end

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

希望它有所帮助,