agenda-group

规则的调用与执行是通过StatelessKieSession或KieSession来实现的,一般的顺序是创建一个StatelessKieSession或KieSession,将各种经过编译的规则添加到session当中,然后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAllRules 方法来触发、执行规则。

在没有调用fireAllRules方法之前,所有的规则及插入的Fact对象都存放在一个Agenda表的对象当中,这个Agenda表中每一个规则及与其匹配相关业务数据叫做Activation,在调用fireAllRules方法后,这些Activation会依次执行,执行顺序在没有设置相关控制顺序属性时(比如salience属性),它的执行顺序是随机的。

Agenda Group是用来在Agenda基础上对规则进行再次分组,可通过为规则添加agenda-group属性来实现。agenda-group属性的值是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group。引擎在调用设置了agenda-group属性的规则时需要显示的指定某个Agenda Group得到Focus(焦点),否则将不执行该Agenda Group当中的规则。

规则代码:

package com.rules

 rule "test agenda-group"

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

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

调用代码:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kSession = kieContainer.newKieSession("ksession-rule");

kSession.getAgenda().getAgendaGroup("abc").setFocus();
kSession.fireAllRules();
kSession.dispose();

执行以上代码,打印结果为:

规则test agenda-group 被触发
其他规则被触发

如果将代码kSession.getAgenda().getAgendaGroup(“abc”).setFocus()注释掉,则只会打印出:

其他规则被触发

很显然,如果不设置指定AgendaGroup获得焦点,则该AgendaGroup下的规则将不会被执行。

后语

你的支持是我努力的最大动力!社区的建立离不开你的支持。此系列课程正在持续更新中,相关讨论QQ(593177274)已经建立,欢迎大家加入讨论。如有疑问可以留言也可以发送本人邮箱secbro2@gmail.com。击此处关注Drools博客专栏的持续更新《Drools博客专栏》

最新文章

  1. [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2
  2. .NET平台开源项目速览(4).NET文档生成工具ADB及使用
  3. 使用Echarts实现动态曲线图表
  4. Spark在Hadoop集群上的配置(spark-1.1.0-bin-hadoop2.4)
  5. iptables 端口转发
  6. Hibernate Id Generator and Primary Key
  7. 测试api代码,简单的接口测试代码
  8. Convert和Parse对null值处理的区别
  9. hdu 4418 Time travel 概率DP
  10. UVa Online Judge 工具網站
  11. <转>为什么转置一个512x512的矩阵,会比513x513的矩阵慢很多?
  12. 区分width()、css('width')、innerWidth()
  13. json_encode如何防止汉字转义成unicode
  14. filter 以及 orderBy的使用
  15. Eclipse一个打开文件夹目录插件——Open In Explorer
  16. XTU 1243 2016
  17. HashMap和ConcurrentHashMap流程图
  18. 《Head First Java》读书笔记(2) - Java面向对象思想
  19. 没事不要在for循环期间增减迭代序列的成员
  20. uva 1232

热门文章

  1. 使用哈工大LTP进行句法分析
  2. 关于 sql server 基本使用的建议
  3. s5_day7装饰器作业
  4. gif 命令大全
  5. SpringBoot服务器压测对比(jetty、tomcat、undertow)
  6. Python数据处理实例
  7. linux中的信号简介和trap命令
  8. JavaWeb Filter
  9. NOIP 选择客栈
  10. The revocation function was unable to check revocation for the certificate