关于drools的检查次数
最近在研究drools,发现一个问题,关于执行检查次数的
public class Unit {
private String name;
private Map<String, TT> tts = new HashMap<String, TT>();
// set and get
}
public class TT {
private String name;
// set and get
}
test.drl
// package and import
rule "test"
when
$t: T ( $name: name == "test")
$u: Unit ( name == "name", tts contains $name)
then
System.out.println("OK");
end
启动程序:
// 创建session
Unit unit = new Unit();
unit.setName("name");
TT tt = new TT();
tt.setName("test");
unit.getTts().put(tt.getName(), tt);
FactHandle f = session.insert(unit);
session.insert(unit.getTts());
session.insert(tt);
// 开启线程
// 在新线程中,每秒执行一次session.update(f, unit);
// fire
s.fireUnitHalt();
最后的执行结果:
OK
OK
。。。。。。最终一共是显示20个OK,然后就不再显示了,很奇怪,不知道这个20次是哪定义的,或者是我的程序什么地方写的不对?
[解决办法]
请列出所有的代码!
[解决办法]
// 开启线程
// 在新线程中,每秒执行一次session.update(f, unit);
问题都不会提,最关键的地方竟然注释掉!
[解决办法]
完整代码:
Unit:
package test;
import java.util.HashMap;
import java.util.Map;
public class Unit {
private String name;
private Map<String, TT> tts = new HashMap<String, TT>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, TT> getTts() {
return tts;
}
public void setTts(Map<String, TT> tts) {
this.tts = tts;
}
}
TT:
package test;
public class TT {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Test:
package test;
import java.util.Collection;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
public class Test {
public static void main(String[] args) throws InterruptedException {
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder.add(ResourceFactory.newClassPathResource("test.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errs = builder.getErrors();
if (!errs.isEmpty()) {
for (KnowledgeBuilderError e: errs) {
System.out.println(e.toString());
}
}
KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase();
Collection<KnowledgePackage> col = builder.getKnowledgePackages();
base.addKnowledgePackages(col);
StatefulKnowledgeSession s = base.newStatefulKnowledgeSession();
Unit unit = new Unit();
unit.setName("name");
TT tt = new TT();
tt.setName("test");
unit.getTts().put(tt.getName(), tt);
FactHandle f = s.insert(unit);
s.insert(tt);
while (true){
s.fireAllRules();
s.update(f, unit);
Thread.sleep(500);
}
}
}
test.drl
package test
rule "rule1"
when
$t: TT( $tname: name == "test")
$u: Unit( name == "name", tts contains $tname)
then
System.out.println("OK");
end
不再使用新线程,直接使用while循环,结果:
OK
OK
一共20次,屡试不爽
[解决办法]
不知道楼主有没有解决这个问题,好像规则中contains的使用对象只能是 CollectionArray或Array类型的对象,用别的对象可能会有问题,建议tts换成ArrayList