auto-focus

在agenda-group章节,我们知道想要让AgendaGroup下的规则被执行,需要在代码中显式的设置group获得焦点。而此属性可配合agenda-group使用,代替代码中的显式调用。默认值为false,即不会自动获取焦点。设置为true,则可自动获取焦点。

对于规则的执行的控制,还可以使用org.kie.api.runtime.rule. AgendaFilter来实现。用户可以实现该接口的accept方法,通过规则当中的属性值来控制是否执行规则。

方法体如下:

boolean accept(Match match);

在该方法当中提供了一个Match参数,通过该参数可以获得当前正在执行的规则对象和属性。该方法要返回一个布尔值,返回true就执行规则,否则不执行。

auto-focus使用示例代码

规则代码:

package com.rules

 rule "test agenda-group"

    agenda-group "abc"
    auto-focus true

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

执行规则代码:

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

执行结果:

规则test agenda-group 被触发

这里,我们没有在代码中显式的让test agenda-group获取焦点,但规则同样被执行了,说明属性配置已生效。

AgendaFilter代码实例

规则文件代码:

package com.rules

 rule "test-agenda-group"

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

rule other

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

实现的MyAgendaFilter代码:

package com.secbro.drools.filter;

import org.kie.api.runtime.rule.AgendaFilter;
import org.kie.api.runtime.rule.Match;

/**
 * Created by zhuzs on 2017/7/19.
 */
public class MyAgendaFilter implements AgendaFilter{

    private String ruleName;

    public MyAgendaFilter(String ruleName) {
        this.ruleName = ruleName;
    }

    @Override
    public boolean accept(Match match) {
        return match.getRule().getName().equals(ruleName) ? true : false;
}
// 省略getter/setter方法
}

测试方法:

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

AgendaFilter filter = new MyAgendaFilter("test-agenda-group");
kSession.fireAllRules(filter);
kSession.dispose();

执行结果:

规则test-agenda-group 被触发

在执行规则的Filter中传入的规则名称为test-agenda-group,此规则被执行。而对照组的规则other,却未被执行。

后语

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

最新文章

  1. Linux C编程学习之开发工具2---GDB调试器
  2. Java魔法堂:类加载机制入了个门
  3. 设计模式 之 策略(Strategy)模式
  4. Python学习资料汇总
  5. 如何使用不同参数组合生成独立的TestCase函数(Python)
  6. java新手笔记31 集合实现类
  7. python del函数
  8. ASP.NET 不同页面之间传值
  9. SQL Server将一列的多行内容拼接成一行的问题讨论
  10. Android ProgressDialog 加载进度
  11. Android 原生listview item伸展收缩效果 (续)
  12. swing中几种layout示例(转)
  13. Linux连接xshell找不到IP信息
  14. 调用短信接口,先var_dump()看数据类型是object需要json_decode(json_encode( $resp),true)转换成array
  15. [ERROR] InnoDB: Cannot allocate memory for the buffer pool
  16. LeetCode第[11]题(Java):Container With Most Water 标签:Array
  17. 解决将/etc/passwd文件中1000改为0后只能guest进入系统的问题
  18. C# Winform使用Windows Media Player播放多媒体整理
  19. Spark搭建HA具体解释
  20. 第三章 使用Servlet处理HTTP响应

热门文章

  1. Memcached基础介绍
  2. 转:asp.net获取url各项参数
  3. 对象序列化与反序列化local class incompatible
  4. 【转】Matlab使用过程中内存不足问题的总结
  5. 使用Linq to XML 修改app.config
  6. winrar5.0注册码
  7. 单片机、嵌入式CAN通信原理
  8. Linux系统下修改IP地址、网关、DNS的基本方法
  9. iOS 开发 申请定位
  10. java实现同步的方法