提问者:小点点

在drools中删除知识包时出现异常


我在口水论坛上问了这个问题,没人回答。所以我在这里问。

我们的规则是从数据库创建动态。我们使用Drools 6.0.1。当删除规则时,使用API知识基础。移除知识包(),异常被抛出。

规则内容如下:

package test 

import java.util.Map 

rule "test" 

    salience 0 
    date-effective "2014-05-19" 
    date-expires "2014-12-30" 
    no-loop true   

   when 

       Map( this['_type'] == 'SaleItemInfo' && ( 
        this['filmTypeKey'] in ("1") 
        && 
        this['sumPrice'] > 4B 
       )) 

       Map( this['_type'] == 'Member' && ( 
            this['dynamicPeriod'] == "CurrentDay" 
              && 
                this['consumeWayCode'] == "01324T" 
                  && 
                this['dynamicConsumeCount'] > 10 
       )) 

       Map( this['_type'] == 'SaleItemInfo' && ( 
        this['filmTypeKey'] in ("1") 
       ))

   then 
       System.out.println("=============="); 

end 

当我删除规则时,抛出异常:

我找到https://issues.jboss.org/browse/JBRULES-2465说这个问题已经解决了。

当我将drools版本更改为5.6时,没有抛出异常。

那么,这是一个问题,还是我在我们的规则文件中犯了一个错误?谢谢。

更新:

根据laune的建议,我在这里添加了演示代码:

public class DemoTest {
  public static void main(String[] args) {
    System.setProperty( "drools.dateformat", "yyyy-MM-dd" );

    KnowledgeBuilderConfiguration builderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(builderConf);
    builder.add(ResourceFactory.newClassPathResource("demo.drl"), ResourceType.DRL);

    if (builder.hasErrors()) {
        throw new RuntimeException(builder.getErrors().toString());
    }
    KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
    Collection<KnowledgePackage> packs = builder.getKnowledgePackages();
    kBase.addKnowledgePackages(packs);
    StatelessKnowledgeSession session = kBase.newStatelessKnowledgeSession();

    List<Object> facts = new ArrayList<Object>();
    Map<String, Object> f1 = new HashMap<String, Object>();
    f1.put("_type", "SaleItemInfo");
    f1.put("sumPrice", 100);
    f1.put("filmTypeKey", "1");
    facts.add(f1);

    Map<String, Object> f2 = new HashMap<String, Object>();
    f2.put("_type", "SaleItemInfo");
    f2.put("sumPrice", 300);
    f2.put("filmTypeKey", "1");
    facts.add(f2);

    Map<String, Object> f3 = new HashMap<String, Object>();
    f3.put("_type", "Member");
    f3.put("dynamicPeriod", "CurrentDay");
    f3.put("consumeWayCode", "01324T");
    f3.put("dynamicConsumeCount", 20);
    facts.add(f3);

    session.execute(facts);
    for(KnowledgePackage pk : packs) {
        kBase.removeKnowledgePackage(pk.getName());
    }
  }

}

为了便于测试,我将规则内容复制到demo. drl。在我们的系统中,我们没有drl文件,所有规则都是从数据库加载和组合的,但逻辑是相同的。


共1个答案

匿名用户

总结所有:

1)规则写得不好,因为第三个CE绑定了与第一个相同的Map对象CE(以及,取决于WM内容)具有给定约束的任何其他Map。=

2)演示代码包含

session.execute(facts);
for(KnowledgePackage pk : packs) {
    kBase.removeKnowledgePackage(pk.getName());
}

从(无状态)会话中删除知识包是没有意义的。无论如何,会话已经被执行处置了,知识库可以“扔掉”而不会清空它。

3)至于从Drools 6. x中删除回归,我强烈建议@michael在这个列表上再试一次:rules-users@lists.jboss.org。AFAIK,这个列表接受所有电子邮件。(如果还有其他失败,请在这里评论,我会处理的。)

我希望这有助于澄清和改善这个问题。