参考书籍:《Drools规则引擎技术指南》来志辉 | 微信读书
最简单的示例
规则引擎的配置方式最基本的方式有2种,一个是静态配置文件,另一个是动态加载
(一) 静态配置文件方式
- 新建一个空
maven
项目resoures
下建META-INF
目录,并新建kmodule.xml
文件resoures
下建reules.collect文件夹
, 并新建一个drools-rule1.drl
文件src
下新建com.pojo
包路径,新建一个Person
类- 建立一个测试类,这里是
MainTest
以下几个是文件内容详解
pom
文件引用maven
包
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.10.0.Final</version>
</dependency>
kmodule.xml
文件内容
<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rule_test1" packages="rules.collect">
<ksession name="rule_test1_session"/>
</kbase>
</kmodule>
drools-rule1.drl
文件内容
package rules.collect //当前drl文件所在resources中的路径
import com.pojo.Person //引用包是 Person 类的路径名
rule "test001"
when
eval(true);
then
System.out.println("Hello World");
end
rule "test002"
when
$p:Person(age>21,$n:name=="liuyb")
then
$p.setName("Banana");
update($p);
System.out.println("检查姓名:"+$n);
System.out.println("输出引用对象 "+$p);
end
实体类
Person
内容
@Data
public class Person {
private int age;
private String name;
}
测试代码
public static void main(String[] args) {
KieServices factory = KieServices.Factory.get();
KieContainer container = factory.getKieClasspathContainer();
KieSession session = container.newKieSession("rule_test1_session");
Person person = new Person();
person.setName("liuyb");
person.setAge(22);
session.insert(person);
int count = session.fireAllRules();
System.out.println("总共执行了条" + count + "规则");
session.dispose();
}
这样静态配置的方式就完成了, 执行MainTest测试代码
(二) 动态配置加载
这里是用字符串形式进行简单使用示例
将规则文件中的字符串全部拷贝出来,准备好
实战应用中规则内容比较少,可以通过数据库字段进行存取,量特别大时候要使用写配置文件的方式
测试代码
public static void main(String[] args) {
// 规则文本字符串
String drlStr = "package rules.collect\n" +
"import com.pojo.Person\n" +
"\n" +
"rule \"test001\"\n" +
" when\n" +
" eval(true);\n" +
" then\n" +
" System.out.println(\"Hello World\");\n" +
"\n" +
"end\n" +
"\n" +
"rule \"test002\"\n" +
" when\n" +
" $p:Person(age>21,$n:name==\"liuyb\")\n" +
" then\n" +
" $p.setName(\"Banana\");\n" +
" update($p);\n" +
" System.out.println(\"检查姓名:\"+$n);\n" +
" System.out.println(\"输出引用对象 \"+$p);\n" +
"\n" +
"end";
Person person = new Person();
person.setName("liuyb");
person.setAge(22);
KieHelper helper = new KieHelper();
helper.addContent(drlStr, ResourceType.DRL);
KieSession kieSession = helper.build().newKieSession();
kieSession.insert(person);
kieSession.fireAllRules();
kieSession.dispose();
}
直接运行即可