我正在测试 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/