- 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