必威体育Betway必威体育官网
当前位置:首页 > IT技术

drool 7.x 属性 : agenda-group

时间:2019-08-29 23:11:05来源:IT技术作者:seo实验室小编阅读:89次「手机版」
 

Agenda

Agenda Group 是用来在Agenda 的基础之上,对现在的规则进行再次分组,具体的分组方法可以采用为规则添加agenda-group 属性来实现。

agenda-group 属性的值也是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group,默认情况下,引擎在调用这些设置了agenda-group 属性的规则的时候需要显示的指定某个Agenda Group 得到Focus(焦点),这样位于该Agenda Group 当中的规则才会触发执行,否则将不执行。


/Users/lcc/IdeaProjects/drools_test/src/main/resources/META-INF/kmodule.xml
 <kbase name="agendaGroup1"  packages="com.drools.attribute.agendaGroup.test1" >
        <ksession name="agendaGroup1-session"/>
    </kbase>
    <kbase name="agendaGroup2"  packages="com.drools.attribute.agendaGroup.test2" >
        <ksession name="agendaGroup2-session"/>
    </kbase>
    <kbase name="agendaGroup3"  packages="com.drools.attribute.agendaGroup.test3" >
        <ksession name="agendaGroup3-session"/>
    </kbase>

规则

/Users/lcc/IdeaProjects/drools_test/src/main/resources/com/drools/attribute/agendaGroup/test1/rule.drl
package com.drools.attribute.agendaGroup.test1

rule "test agenda-group"
    agenda-group "abc"
    when
    then
        System.out.println("规则test agenda-group 1被触发");
    end



rule otherRule

    when
    then
        System.out.println("其他规则被触发");
    end

规则2

/Users/lcc/IdeaProjects/drools_test/src/main/resources/com/drools/attribute/agendaGroup/test2/rule.drl
package com.drools.attribute.agendaGroup.test2

rule "test agenda-group"
    agenda-group "abc"
    when
    then
        System.out.println("规则test agenda-group 1被触发");
    end

rule "test1 agenda-group"
    agenda-group "abc"
    when
    then
        System.out.println("规则test agenda-group 2被触发");
    end



rule otherRule

    when
    then
        System.out.println("其他规则被触发");
    end

规则3

/Users/lcc/IdeaProjects/drools_test/src/main/resources/com/drools/attribute/agendaGroup/test3/rule.drl
package com.drools.attribute.agendaGroup.test3

rule "test agenda-group"
    agenda-group "abc"
    salience  1
    when
    then
        System.out.println("规则test agenda-group 1被触发");
    end

rule "test1 agenda-group"
    agenda-group "abc"
    salience 10
    when
    then
        System.out.println("规则test agenda-group 2被触发");
    end



rule otherRule

    when
    then
        System.out.println("其他规则被触发");
    end

测试类

package com.drools.attribute.agendaGroup;

import com.secbro.drools.model.Product;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.Kiecontainer;
import org.kie.api.runtime.KieSession;

/**
 * Created by lcc on 2018/9/28.
 */
public class TestAgendaGroup {

    /**
     * 测试点:agenda-group  只有一个   而且没有 focus
     *
     * 其他规则被触发
     * 命中了1条规则!
     * 商品GOLD的商品折扣为10%。
     *
     */
    @Test
    public void onLoopTest0() {
        // 构建KieServices
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
        KieSession kSession = kieContainer.newKieSession("agendaGroup1-session");

        Product product = new Product();
        product.setType(Product.GOLD);
        product.setDiscount(10);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "条规则!");
        System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");

        kSession.dispose();

    }

    /**
     *  测试点:agenda-group  只有一个   而且有 focus
     *
     *  规则test agenda-group 1被触发
     *  其他规则被触发
     *  命中了2条规则!
     *  商品GOLD的商品折扣为10%。
     */
    @Test
    public void onLoopTest1() {
        // 构建KieServices
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
        KieSession kSession = kieContainer.newKieSession("agendaGroup1-session");
        kSession.getAgenda().getAgendaGroup("abc").setFocus();

        Product product = new Product();
        product.setType(Product.GOLD);
        product.setDiscount(10);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "条规则!");
        System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");

        kSession.dispose();

    }


    /**
     * 测试点:agenda-group  有2个   而且没有 focus
     *
     * 其他规则被触发
     * 命中了1条规则!
     * 商品GOLD的商品折扣为10%。
     */
    @Test
    public void onLoopTest2() {
        // 构建KieServices
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
        KieSession kSession = kieContainer.newKieSession("agendaGroup2-session");
//        kSession.getAgenda().getAgendaGroup("abc").setFocus();

        Product product = new Product();
        product.setType(Product.GOLD);
        product.setDiscount(10);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "条规则!");
        System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");

        kSession.dispose();

    }


    /**
     * 测试点:agenda-group  有2个   而且有 focus
     *
     规则test agenda-group 1被触发
     规则test agenda-group 2被触发
     其他规则被触发
     命中了3条规则!
     商品GOLD的商品折扣为10%。
     */
    @Test
    public void onLoopTest3() {
        // 构建KieServices
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
        KieSession kSession = kieContainer.newKieSession("agendaGroup2-session");
        kSession.getAgenda().getAgendaGroup("abc").setFocus();

        Product product = new Product();
        product.setType(Product.GOLD);
        product.setDiscount(10);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "条规则!");
        System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");

        kSession.dispose();

    }


    /**
     * 测试点:agenda-group  有2个   而且有 focus  有 salience
     *
     规则test agenda-group 2被触发
     规则test agenda-group 1被触发
     其他规则被触发
     命中了3条规则!
     商品GOLD的商品折扣为10%。

     salience 越大 越先执行

     */
    @Test
    public void onLoopTest4() {
        // 构建KieServices
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
        KieSession kSession = kieContainer.newKieSession("agendaGroup3-session");
        kSession.getAgenda().getAgendaGroup("abc").setFocus();

        Product product = new Product();
        product.setType(Product.GOLD);
        product.setDiscount(10);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "条规则!");
        System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");

        kSession.dispose();

    }

}

总结:

  1. 如果不设置指定AgendaGroup获得焦点,则该AgendaGroup下的规则将不会被执行。
  2. 如果设置了AgendaGroup获得焦点,组下的规则都会被执行,并且是按顺序
  3. 如果设置了AgendaGroup获得焦点,组下的规则都会被执行,如果设置了salience,那么将按照大小执行

详细参考:https://github.com/lccbiluox2/drools_test.git

测试类:drools_test/src/test/java/com/drools/attribute/agendaGroup/TestAgendaGroup.java

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读