删除drools中的KnowledgePackage时出现异常

删除drools中的KnowledgePackage时出现异常,drools,Drools,我在drools论坛上问了这个问题,没有人回答。所以我在这里问 我们的规则是从数据库创建动态数据。我们使用Drools 6.0.1。 删除规则时,请使用API knowledgeBase.removeKnowledgePackage(), 例外情况是抛出 规则内容如下: package test import java.util.Map rule "test" salience 0 date-effective "2014-05-19" date-expi

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

我们的规则是从数据库创建动态数据。我们使用Drools 6.0.1。 删除规则时,请使用API knowledgeBase.removeKnowledgePackage(), 例外情况是抛出

规则内容如下:

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 
当我删除该规则时,会引发异常:

java.lang.IllegalArgumentException:当接收器列表为空时,无法删除接收器
位于org.drools.core.reteoo.ObjectSource.removeObjectSink(ObjectSource.java:203)
位于org.drools.core.reteoo.ObjectSource.doRemove(ObjectSource.java:242)
位于org.drools.core.common.BaseNode.remove(BaseNode.java:120)
位于org.drools.core.reteoo.ReteooBuilder.removeNode(ReteooBuilder.java:240)
位于org.drools.core.reteoo.ReteooBuilder.removeTerminalNode(ReteooBuilder.java:183)
位于org.drools.core.reteoo.ReteooBuilder.removeRule(ReteooBuilder.java:157)
位于org.drools.core.reteoo.ReteooRuleBase.removule(ReteooRuleBase.java:1409)
位于org.drools.core.reteoo.reteorulebase.removule(reteorulebase.java:1400)
位于org.drools.core.reteoo.reteorulebase.removePackage(reteorulebase.java:1318)
位于org.drools.core.impl.KnowledgeBaseImpl.removeKnowledgePackage(KnowledgeBaseImpl.java:205)
位于com.oristartech.rule.drools.DroolsTest.removePackage(DroolsTest.java:128)
位于com.oristartech.rule.drools.DroolsTest.testDrools(DroolsTest.java:67)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)。
….

我发现他说这个问题已经解决了

当我将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());
    }
  }

}
公共类降级{
公共静态void main(字符串[]args){
System.setProperty(“drools.dateformat”,“yyyy-MM-dd”);
KnowledgeBuilderConfiguration builderConf=KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
KnowledgeBuilder=KnowledgeBuilderFactory.newKnowledgeBuilder(builderConf);
add(ResourceFactory.newClassPathResource(“demo.drl”)、ResourceType.drl);
if(builder.hasErrors()){
抛出新的RuntimeException(builder.getErrors().toString());
}
KnowledgeBase kBase=KnowledgeBaseFactory.newKnowledgeBase();
集合包=builder.getKnowledgePackages();
kBase.addKnowledgePackages(包);
无状态知识会话=kBase.newStatelessKnowledgeSession();
列表事实=新的ArrayList();
Map f1=新的HashMap();
f1.输入(“_type”,“SaleItemInfo”);
f1.卖出价(“sumPrice”,100);
f1.输入(“filmTypeKey”、“1”);
事实。添加(f1);
Map f2=新的HashMap();
f2.输入(“_类型”,“SaleItemInfo”);
f2.卖出价(“sumPrice”,300);
f2.输入(“filmTypeKey”、“1”);
添加(f2);
Map f3=新的HashMap();
f3.投入(“U型”、“成员”);
f3.卖出(“动态期”、“当前日”);
f3.投入(“消费代码”,“01324T”);
f3.投入(“动态消费计算”,20);
事实。添加(f3);
执行(事实);
用于(知识包主键:包){
kBase.removeKnowledgePackage(pk.getName());
}
}
}
为了便于测试,我将规则内容复制到demo.drl。在我们的系统中,我们没有drl文件, 所有规则都是从数据库加载和组合的,但逻辑是相同的。

要总结所有规则:

1) 该规则编写得不好,因为第三个CE绑定了与第一个CE相同的映射对象(并且,根据WM内容)以及具有给定约束的任何其他映射。=>AP为@michael改进规则生成器

2) 演示代码包含

session.execute(facts);
for(KnowledgePackage pk : packs) {
    kBase.removeKnowledgePackage(pk.getName());
}
从(无状态)会话中删除知识包是毫无意义的。会话已被execute处理,可以“丢弃”知识库而不清空它

3) 至于删除Drools 6.x的回归,我强烈建议@michael在这个列表上再试一次:规则-users@lists.jboss.org. 好的,这个列表接受所有的电子邮件。(如果有其他故障,请在此处进行评论,我会处理。)


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

哪个论坛?这不符合规则-users@lists.jboss.org.The第三个条件元素是多余的,甚至可能是有害的:它匹配与第一个CE匹配的任何映射,可能还有其他几个映射,因此规则可以使用成对的不同映射事实重复触发。这些问题总是需要一个小但完整的(!)演示问题的代码示例。我建议您将此添加到此处,或尝试使用此列表。laune,我认为邮件列表不接受我的帖子。@laune,我们为客户提供了一个网页,他们可以自由定义规则,因此有时规则内容会像问题中所示。我意识到这将导致完全笛卡尔乘积,我认为我们必须在网页中添加一些约束。我在邮件列表中再次发布:我检查我的新帖子,邮件列表也不接受它。可不可以?你必须做点什么才能被“接受”——或者直接在Drools用户列表中注册。不管怎样,纳布尔是一个皮塔。