java - Drools:在drl文件中设置标志

原文 标签 java drools

我正在测试Drools drl文件中的某些条件,并且如果其中任何一个条件为真,我想在调用程序中设置一个标志。

我尝试通过以下方式进行此操作:

-drl文件----

//created on: 28 Aug, 2013
package flowManagers

import flowHelper.OrderRelatedQueriesFlowHelper;
import entity.Order;
import org.apache.log4j.Logger;

global Logger logger;
global Boolean isValid;

rule "isValid"
no-loop
salience -1
activation-group "AC1" 

when
        $o : Order( OrderRelatedQueriesFlowHelper.isValid($o))
then 
        isValid=Boolean.TRUE;
        logger.info("Valid order..." );
end


---调用程序位----

    Boolean isValid=Boolean.FALSE;
    String[] noHappyOrderFileList={"NoHappyOrder.drl"};
    StatefulKnowledgeSession ksession = createKnowledgeSession( noHappyOrderFileList );
    ksession.setGlobal("logger", logger);
    ksession.setGlobal( "isValid", isValid);
    for( Order fo : coll )
    {           
        ksession.insert(fo);
    }
    ksession.fireAllRules();

    logger.info("Valid?? : " + isValid );


但是即使记录器在drl文件中打印“ Valid order ...”,调用程序仍将isValid打印为false。

有人可以告诉我我做错了吗?

谢谢 :)

最佳答案

Drools使用“事实”而不是对象。事实是一个对象,但每个对象都不是事实。请考虑一下Boolean.TRUE代表什么。

然后考虑以下代码:

when
  $orderstatus : OrderStatus(...)
then
  modify ($orderstatus) {
     valid = Boolean.TRUE
  }


OrderStatus事实的有效性只能表示一件事,但是Boolean.TRUE的含义太广泛,无法用作事实。

关于java - Drools:在drl文件中设置标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18483769/

相关文章:

java - jackson:反序列化列表时捕获单个项目的异常

java - 如何使用 AutoValue 解析 JSON 结构为对象数组?

java - 从drools 5(5.5.0.Final)升级到drools 6的过程

java - 从累积函数或规则代码访问 drools session 时钟

Drools 在运行时从数据库中获取事实

java - 关闭StreamReader

java - 如何从jDateChooser更改格式日期?

构造函数的java数组固定元素

java - Drools Fusion:更新到6.0.0.CR4之后,不会触发带有时间运算符“after”的规则

java - 如何在 Drools 5.6 规则中定义一个常量集合