器 | Drools-Group

一、Drools-Group

Drools-Group 分为三种类型,分别是activation-group(议程组)ruleflow-group(规则流组),还有agenda-group(激活组)

/**
*具有相同activation-group属性的规则中只要有一个被执行,其他的规则都不再执行。
*可以用类似salience之类的属性来实现规则的执行优先级
*/
activation-group
/**
*将规则划分一个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用
*对应的规则,该属性会通过流程的走向确定要执行哪一条规则
*/
ruleflow-group
/**
*Agenda Group 是用来在Agenda基础上对规则进行再次分组。引擎在调用设置了agenda-group
*属性的规则时需要显示的指定某个agenda group 获得focus,否则将不执行此组的规则。
*/
agenda-group
复制代码

二、 Agenda-group

议程组允许将规则以组的形式,并将这么组放入堆栈,堆栈具有push/pop操作,通过SetFocus完成Push操作。

kieSession.getAgenda().getAgendaGroup("group2").setFocus();
复制代码

议程总是在栈顶执行,当议程组所有的规则执行后,这个议程组会被移除然后执行下一组。

规则的调用与执行是通过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当中的规则。

public void excuteAgendaGroup(){
    KieBase kieBase = KieStarter.newKieBase(getAgendaGroupDrl());
    KieSession kieSession = kieBase.newKieSession();
    //group2 后执行
    kieSession.getAgenda().getAgendaGroup("group2").setFocus();
    //group1 先执行
    kieSession.getAgenda().getAgendaGroup("group1").setFocus();
    kieSession.fireAllRules();
    kieSession.dispose();
}
​
private String getAgendaGroupDrl(){
    return  "rule "test-agenda-group1" " +
            "agenda-group "group1" " +
            "when then System.out.println("test-agenda-group1-1 被触发"); " +
            "end " +
            "rule "test-agenda-group2" " +
            "agenda-group "group2" " +
            "when " +
            "then " +
            "System.out.println("test-agenda-group2 被触发"); end\n" +
            "rule "test-agenda-group3" " +
            "agenda-group "group1" " +
            "when then System.out.println("test-agenda-group1-2 被触发"); " +
            "end ";
}
复制代码

三、Activation-Group

激活组要求相同组只执行一个

该属性将若干个规则划分成一个组,统一命名。在执行的时候,具有相同activation-group 属性的规则中只要有一个被执行,其它的规则都不再执行。可以用类似salience之类属性来实现规则的执行优先级。

public void executeActivationGroup(){
    KieBase kieBase = KieStarter.newKieBase(getActivationGroupDrl());
    KieSession kieSession = kieBase.newKieSession();
    kieSession.fireAllRules();
}
private String getActivationGroupDrl(){
    return  "rule "test-activation-group1" " +
            "salience  1"+
            "activation-group "group1" " +
            "when then System.out.println("test-activation-group1 被触发"); " +
            "end " +
            "rule "test-activation-group2" " +
            "salience  2"+
            "activation-group "group1" " +
            "when " +
            "then " +
            "System.out.println("test-activation-group2 被触发"); end\n";
}
复制代码

四、Flow-Group

流式组支持服务编排,像工作流一样先后顺序运行规则

在使用规则流的时候要用到ruleflow-group属性,该属性的值为一个字符串,作用是将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用对应的规则。该属性会通过流程的走向确定要执行哪一条规则。在规则流中有具体的说明。

rule "test-ruleflow-group1"
    ruleflow-group "group1"
    when
    then
        System.out.println("test-ruleflow-group1 被触发");
    end
rule "test-ruleflow-group2"
    ruleflow-group "group1"
    when
    then
        System.out.println("test-ruleflow-group2 被触发");
    end
复制代码

\


作者:青Cheng序员石头
链接:https://juejin.cn/post/6994750386989416461
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<think>好的,用户让我介绍一下Drools规则引擎设计。首先,我需要确认自己对Drools的理解是否正确。Drools是一个基于Java的开源规则引擎,属于业务规则管理系统(BRMS),它允许将业务规则从应用程序代码中分离出来,方便管理和修改。规则引擎设计应该是用来创建和管理这些规则的工具,可能包括图形化界面。 接下来,用户的需求可能是什么?他们可能想了解如何设计规则,或者在选择规则引擎时比较不同产品。需要明确Drools设计的核心功能、优势,以及使用场景。可能需要分步骤解释,结构清晰。 然后,我需要回忆Drools的架构。Drools有规则引擎核心(Drools Engine),规则库存储规则文件(.drl),工作内存(Working Memory)存储事实对象,规则匹配通过模式匹配算法(RETE)进行。设计应该提供图形化界面来编辑这些规则,可能生成.drl文件。 用户可能关心设计的功能,比如可视化编辑、语法检查、调试工具,以及如何集成到项目中。需要介绍这些点,并说明优势,比如降低技术门槛,提升效率。 还要考虑用户可能的疑问,比如设计是否支持版本控制,团队协作,或者与Spring等框架的集成。可能需要提到Drools Workbench(以前叫Guvnor)作为Web管理工具,支持协作和版本管理。 另外,实际应用场景的例子会有帮助,比如金融风控、电商促销等,说明设计如何在这些场景中使用。需要注意使用中文,避免专业术语过多,必要时解释概念。 需要检查是否有遗漏的重要点,比如规则语法DRL,DSL,决策表等,设计是否支持这些格式的创建。可能还要提到测试和模拟功能,帮助用户验证规则逻辑。 最后,确保回答结构清晰,分步骤或分点说明,符合用户要求的“结构清晰,逐步解决问题”。避免技术细节过于深入,保持概述性质,同时真实可靠,不夸大功能。</think>Drools规则引擎设计是用于简化业务规则创建和管理的可视化工具。以下分步骤介绍其核心设计原理和功能: 一、架构设计基础 $$ \text{Drools架构} = \text{规则引擎核心} + \text{规则库} + \text{工作内存} $$ 1. RETE算法实现:采用改进的RETE-OO算法进行模式匹配 2. 规则存储:支持.drl文件、决策表、DSL等格式 3. 执行流程:事实对象插入工作内存 → 模式匹配 → 触发规则 二、核心功能模块 1. 可视化编辑 - 拖拽式条件/动作配置 - 实时语法检查 - 规则流程图生成 2. 规则调试 ```java // 示例调试代码 KieSession ksession = kbase.newKieSession(); ksession.setGlobal("logger", LoggerFactory.getLogger(getClass())); ksession.insert(factObject); ksession.fireAllRules(); ``` 3. 版本控制系统 - Git集成 - 规则变更历史追溯 - 分支合并支持 三、关键设计特性 $$ \text{效率公式}: T = \frac{N}{R \times C} $$ (其中N=规则数量,R=规则复杂度,C=硬件配置) 1. 声明式编程模型 2. 动态规则加载 3. 多级冲突解决策略 - salience优先级 - agenda-group - activation-group互斥 四、典型应用场景 1. 金融领域:风控规则配置 ```drl rule "高风险交易预警" when $t: Transaction(amount > 1000000, currency == "USD") then riskService.alert($t); end ``` 2. 电商领域:促销规则管理 3. 物联网:设备告警规则配置 五、最佳实践建议 1. 规则粒度控制:单个规则不超过5个条件 2. 性能优化: - 避免过度使用`not`和`exists` - 合理使用`lock-on-active` 3. 维护策略: - 版本控制规则文件 - 建立规则分类目录 - 定期执行规则质量检查 该设计通过可视化界面降低了规则开发门槛,同时保持了对复杂业务场景的支持能力。实际使用中建议结合Drools Workbench进行全生命周期管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值