首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

关于drools的稽查次数

2012-12-17 
关于drools的检查次数最近在研究drools,发现一个问题,关于执行检查次数的public class Unit {private Stri

关于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

热点排行