📜  Drools-常用术语(1)

📅  最后修改于: 2023-12-03 14:40:52.485000             🧑  作者: Mango

Drools-常用术语

Drools 是一个基于规则的业务逻辑管理系统,可以帮助开发者管理业务逻辑并实现更高效的决策管理。本文介绍 Drools 中常用术语及其含义。

Rule

Rule 是指规则,通常是一句描述了业务逻辑的语句。Rule 由多个部分构成:条件、动作和触发事件。规则引擎根据条件来判断是否应该执行某个 Rule,一旦满足条件,规则引擎将执行对应的动作。

示例代码:

规则格式:
rule " <ruleName> "
dialect "java"
when
  <condition>
then
  <action>
end

示例:
rule "Person is baby"  //规则名称
dialect "java"        //设定语言
when
  person.getAge() < 3 //当 person 年龄小于3岁时
then
  System.out.println("This person is a baby"); //执行动作
end
Fact

Fact 是事实,指业务过程中的一个实例对象。Fact 可以是一个简单的 Java 对象,也可以是一个复杂的业务对象。事实与规则引擎之间的联系是通过 working memory 实现的。

示例代码:

实例对象:
public class Person {
    private String name;  //姓名
    private int age;      //年龄
    private boolean married; //婚否
    //Setters & Getters
}

实例对象生成:
Person person = new Person();
person.setName("zhangsan");
person.setAge(20);
person.setMarried(false);

Fact 对象:
KieSession kieSession = ...; //获取 KieSession 对象
kieSession.insert(person);  //将实例对象插入 working memory 中
Working Memory

Working Memory 是执行规则的环境,其中会存储所有与业务过程有关的事实对象,并且会用现有的事实对象来匹配规则并执行规则的动作部分。

Working Memory 分为两个部分:Working Memory Entry 和 Rule Flow Memory。Working Memory Entry 存储着有关实例对象的信息,Rule Flow Memory 则用于管理规则流程的执行。

示例代码:

KieSession kieSession = ...; //获取 KieSession 对象
kieSession.insert(person);  //将实例对象插入 working memory 中
kieSession.fireAllRules();  //执行所有规则
Agenda

Agenda 是规则引擎的执行计划,决定了规则的执行顺序。Agenda 中包含很多规则,并按照优先级将规则排序。Drools 会优先执行优先级高的规则,当有多个规则优先级相同时,会随机选择一个执行。

示例代码:

KieSession kieSession = ...; //获取 KieSession 对象
kieSession.getAgenda().getAgendaGroup("groupName").setFocus(); //设置执行计划
Working Memory Event

Working Memory Event 是 working memory 中事实变化的通知事件,通常是对事实对象作出的更改、插入或者删除等操作。

示例代码:

public class WorkingMemoryEventListenerImpl implements WorkingMemoryEventListener {
    public void objectUpdated(ObjectUpdatedEvent event) {
        ...
    }
    public void objectInserted(ObjectInsertedEvent event) {
        ...
    }
    public void objectDeleted(ObjectDeletedEvent event) {
        ...
    }
}

KieSession kieSession = ...; //获取 KieSession 对象
kieSession.addEventListener(new WorkingMemoryEventListenerImpl()); //注册 WorkingMemoryEventListenerImpl