1:pom文件
<!--drools--> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.10.0.Final</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> 2.新建 kmodule.xml 路径 resources\META-INF\kmodule.xml
<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="rules"> <ksession name="all-rules"/> </kbase> </kmodule> 3.drl 文件
路径 resources\rules\test.drl
import com.example.serviceorder.vo.Person dialect "mvel" rule "age" when $person : Person(name=='小明') then $person.setAge(11); System.out.println("我叫:"+$person.getName()+",现在:"+$person.getAge()+"岁"); end rule "age1" when $person : Person(name=='小黑') then $person.setAge(13); System.out.println("我叫:"+$person.getName()+",现在:"+$person.getAge()+"岁"); end rule "age2" when $person : Person(name=='小白') then $person.setAge(14); System.out.println("我叫:"+$person.getName()+",现在:"+$person.getAge()+"岁"); end
4. 实体
package com.example.serviceorder.vo; /** * @author lwq * @date 2022/6/5 21:38 * @desciption: 测试 */ public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 5.测试类
private static KieContainer container = null; private KieSession statefulKieSession = null; @Test public void test111() { KieServices kieServices = KieServices.Factory.get(); container = kieServices.getKieClasspathContainer(); statefulKieSession = container.newKieSession("all-rules"); Person person = new Person(); person.setName("小白"); statefulKieSession.insert(person); statefulKieSession.fireAllRules(); statefulKieSession.dispose();
System.out.println(JSON.toJSON(person));
} 6.打印结果 {"name":"小白","age":14} 7.动态加载规则工具类
package com.example.serviceorder.util; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; import org.kie.api.builder.KieRepository; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; /** * @author lwq * @date 2022/6/5 22:02 * @desciption: Drools工具类 */ public class DroolsUtil { private static KieContainer container = null; public static <T> T execute(T t, String rule) { container = load(rule); KieSession kieSession = container.newKieSession(); kieSession.insert(t); kieSession.fireAllRules(); kieSession.dispose(); return t; } private static KieContainer load(String rule) { KieServices kieServices = KieServices.Factory.get(); KieRepository repository = kieServices.getRepository(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); kieFileSystem.write("src/main/resources/rules" + "test.drl", rule); KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); kieBuilder.buildAll(); return kieServices.newKieContainer(repository.getDefaultReleaseId()); } } 8.测试动态加载规则工具类
@Test public void test1112() { //rule 规则可以存在数据库一个字段里面 oracle 数据库可以使用 clob 类型 //mysql 数据库可以使用 longtext类型 //也可以放到 redis 里面
String rule="\n" + "import com.example.serviceorder.vo.Person\n" + "\n" + "dialect \"mvel\"\n" + "\n" + "rule \"age\"\n" + " when\n" + " $person : Person(name=='小明')\n" + " then\n" + " $person.setAge(11);\n" + " System.out.println(\"我叫:\"+$person.getName()+\",现在:\"+$person.getAge()+\"岁\");\n" + "end\n" + "\n" + "rule \"age1\"\n" + " when\n" + " $person : Person(name=='小黑')\n" + " then\n" + " $person.setAge(13);\n" + " System.out.println(\"我叫:\"+$person.getName()+\",现在:\"+$person.getAge()+\"岁\");\n" + "end\n" + "\n" + "rule \"age2\"\n" + " when\n" + " $person : Person(name=='小白')\n" + " then\n" + " $person.setAge(14);\n" + " System.out.println(\"我叫:\"+$person.getName()+\",现在:\"+$person.getAge()+\"岁\");\n" + "end"; Person person = new Person(); person.setName("小明");
DroolsUtil.execute(person, rule); System.out.println(JSON.toJSON(person)); }
6.打印结果 {"name":"小明","age":11}