具有显著性问题的Drools冲突解决程序

具有显著性问题的Drools冲突解决程序,drools,rule,Drools,Rule,我发现了drools引擎的奇怪行为。 我有两条不同的规则。如drools文档中所述 3.3.4.1。冲突解决 当发生冲突时,需要解决冲突 在这个页面上有多个规则 议程(这方面的基础是 在“快速入门”一章中有介绍 触发规则可能会对用户产生副作用 工作记忆,规则引擎 需要知道规则的顺序 应该开火(例如,开火) 规则A可能导致规则B被删除 (从议程中删除) 默认的冲突解决方案 Drools采用的策略包括: 显著性和后进先出(后进先出) 出局) 最明显的是显著性(或 优先级),在这种情况下,用户可以 指

我发现了drools引擎的奇怪行为。 我有两条不同的规则。如drools文档中所述

3.3.4.1。冲突解决

当发生冲突时,需要解决冲突 在这个页面上有多个规则 议程(这方面的基础是 在“快速入门”一章中有介绍 触发规则可能会对用户产生副作用 工作记忆,规则引擎 需要知道规则的顺序 应该开火(例如,开火) 规则A可能导致规则B被删除 (从议程中删除)

默认的冲突解决方案 Drools采用的策略包括: 显著性和后进先出(后进先出) 出局)

最明显的是显著性(或 优先级),在这种情况下,用户可以 指定某个规则具有 更高的优先级(通过给予它更高的优先级) 数字)而不是其他规则。因为 案例,具有较高显著性的规则 将优先考虑。后进先出的优先事项是: 基于指定的工作记忆 操作计数器值,包含所有规则 在同一操作期间创建 接收相同的值。这个 一组点火的执行顺序 具有相同优先级值的是 武断的

但对每种类型使用5个对象执行我的两条规则会产生奇怪的结果——在某些对象上,使用显著性1的规则比使用显著性10的规则执行得更早。 若我从规则中删除更新,将首先执行显著性为10的规则,然后才执行显著性为1的规则

 package com.sample

import com.sample.DroolsTest.Message;
import com.sample.DroolsTest.Message2;



rule "Hello World2"
    salience 10
    when
        m : Message()
        m2 : Message2(status <0)
    then

        System.out.println( "Second Rule With Salience 10"); 
        System.out.println( "m status = "+m.getStatus()); 
        System.out.println( "m2 status = "+m2.getStatus()); 
        m2.setStatus(m2.getStatus()*(-1));
        update(m2);
end

rule "Hello World3"
    salience 1
    when
        m2 : Message2()
        m : Message()
    then
        System.out.println( "Third Rule With Salience 1"); 
        System.out.println( "m status = "+m.getStatus()); 
        System.out.println( "m2 status = "+m2.getStatus()); 
end

rule "GoodBye"
    salience 0
    when
        eval(true)
    then
        System.out.println( "End" );
end
package.com.sample
导入com.sample.DroolsTest.Message;
导入com.sample.DroolsTest.Message2;
规则“Hello World2”
显著性10
什么时候
m:消息()

m2:Message2(状态查看您的drl文件,您正在给出条件“when”部分m2:Message2(状态如果您更改插入顺序,它将首先执行带有显著性10的规则。我与sakharuta的drools和显著性问题完全相同。@titu:我以上面的示例更改了插入顺序。现在显著性工作正常,但为什么?我认为显著性具有最高优先级,是第一个冲突解决方案。@策略,然后后进先出。在我复杂的用例中,我必须向工作记忆中插入多达200000个对象,我对插入顺序没有影响,所以我只能依靠显著性…我也非常感谢您的帮助。谢谢!
    package com.sample;

    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.io.ResourceFactory;
    import org.drools.logger.KnowledgeRuntimeLogger;
    import org.drools.logger.KnowledgeRuntimeLoggerFactory;
    import org.drools.runtime.StatefulKnowledgeSession;

    /**
     * This is a sample class to launch a rule.
     */
    public class DroolsTest {

        public static final void main(String[] args) {
            try {
                // load up the knowledge base
                KnowledgeBase kbase = readKnowledgeBase();
                StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
                KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
                // go !
                System.out.println("Start");
                for(int i=0; i<5; i++){
                    Message message = new Message(i);
                    ksession.insert(message);
                    Message2 message2 = new Message2(-i);
                    ksession.insert(message2);
                }
                ksession.fireAllRules();
                logger.close();
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }

        private static KnowledgeBase readKnowledgeBase() throws Exception {
            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
            kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
            KnowledgeBuilderErrors errors = kbuilder.getErrors();
            if (errors.size() > 0) {
                for (KnowledgeBuilderError error: errors) {
                    System.err.println(error);
                }
                throw new IllegalArgumentException("Could not parse knowledge.");
            }
            KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
            kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
            return kbase;
        }

        public static class Message {

            private int status;

            public int getStatus() {
                return this.status;
            }

            public Message(int status) {
                super();
                this.status = status;
            }

            public void setStatus(int status) {
                this.status = status;
            }

        }

    public static class Message2 {

            private int status;

            public Message2(int status) {
                this.status = status;
            }

            public int getStatus() {
                return this.status;
            }

            public void setStatus(int status) {
                this.status = status;
            }

        }

}