Drools规则引擎概述和基本原理

725 阅读2分钟

image.png

  • Rules:我们自己定义的业务规则,比如我们自己写的规则文件。所有规则必须至少包含触发规则的条件和规则规定的操作。
  • Production memory:规则存储在 Drools 引擎中的位置。
  • Facts:输入或更改到 Drools 引擎中的数据,Drools 引擎匹配规则条件以执行适用规则。在规则中修改了Fact对象的值,真实的JavaBean的数据也会发生改变。 比如:当我们调用ksession.insert(对象),那么插入的这个对象就可以理解成Facts对象。
  • Working memory:facts 在 Drools 引擎中存储的位置。
  • Pattern matcher:匹配器,将Rule Base中所有的规则与Working memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入到Agenda中。
  • Agenda:议程,执行Agenda中被激活的排好序的规则。

首先,我们创建一个简单的规则文件rules.drl,包含以下规则:

package com.example
import com.example.Person

rule "YoungPerson"
  when
    $person: Person(age < 18)
  then
    System.out.println("You are a young person: " + $person.getName());
  end

在上述规则中,我们定义了一个名为YoungPerson的规则,它的条件部分检查Person对象的age属性是否小于18,动作部分将满足条件的Person对象打印到控制台。

接下来,我们创建一个简单的Java类Person.java,表示一个人的信息:

package com.example;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

在上述Java类中,我们定义了一个名为Person的类,包含名称(name)和年龄(age)两个属性。

最后,我们使用Drools规则引擎执行规则,如下所示:

import org.drools.io.ResourceFactory;
import org.drools.compiler.Compiler;
import org.drools.compiler.PackageBuilder;
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;
import org.drools.decisiontable.SpreadsheetCompilerConfiguration;
import org.drools.decisiontable.SpreadsheetResource;
import org.drools.decisiontable.SpreadsheetTableModel;
import org.drools.decisiontable.SpreadsheetTableModelFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.StatelessKnowledgeSession;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class DroolsExample {
    public static void main(String[] args) throws Exception {
        // 加载规则文件
        KieContainer kieContainer = KieServices.Factory.get().newKieContainer(ResourceFactory.newClassPathResource("rules.drl"));

        // 创建一个Person对象
        Person person = new Person("Alice", 20);

        // 创建一个StatefulKnowledgeSession实例
        StatefulKnowledgeSession knowledgeSession = kieContainer.newStatefulKnowledgeSession();

        // 添加Person对象到工作内存
        knowledgeSession.insert(person);

        // 执行规则
        knowledgeSession.fireAllRules();

        // 关闭knowledgeSession
        knowledgeSession.dispose();
    }
}

在上述代码中,我们首先加载rules.drl规则文件,创建一个Person对象,并将其添加到工作内存中。接着,我们执行所有规则,并关闭knowledgeSession。当执行YoungPerson规则时,将输出以下信息:

You are a young person: Alice