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();
}
}
总结:
- 如果不设置指定AgendaGroup获得焦点,则该AgendaGroup下的规则将不会被执行。
- 如果设置了AgendaGroup获得焦点,组下的规则都会被执行,并且是按顺序
- 如果设置了AgendaGroup获得焦点,组下的规则都会被执行,如果设置了salience,那么将按照大小执行
详细参考:https://github.com/lccbiluox2/drools_test.git
测试类:drools_test/src/test/java/com/drools/attribute/agendaGroup/TestAgendaGroup.java