java - 流口水 : Setting a flag from within the drl file

标签 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 - 流口水 : Setting a flag from within the drl file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18483769/

相关文章:

java - 什么可以在序列化和存储在 Jarfile 中时修改 SerialVersionUID?

java - 如何在没有 Eclipse 或任何其他 IDE 的情况下配置 drools

java - 从有状态的 drools session 中获取事实

java - 使用java正则表达式分别提取带小数的Alpha和Numeric包含String

java - Android简单利息计算器

java - SyntaxHighlighter 用 php 加载页面?

java - NoSuchMethodError 由于 Guava jar

java - Drools - 检查 map 是否存在连续日期

java - 在 Android 中以 PKCS#1 格式在 Android 中生成 RSA key

java - Android,ImageView,不需要的填充