Drools与动态加载规则文件
Drools简介
Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。
规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释业务规则,以及基于业务规则做出业务决策,从而提供极大的编程便利。
对系统使用人员来说:
- 将业务规则的创建、修改、维护透明话;
- 提高业务灵活度;
- 减少对开发人员的依赖;
- 避免业务升级带来的风险
对开发人员来说:
- 增加代码灵活性;
- 降低系统维护成本,提高系统可维护性;
- 解耦业务与规则,减少代码修改成本;
- 简化系统架构,优化应用结构;
Drools架构图
快速开始
1. Maven导入
<drools.version>7.23.0.Final</drools.version> <lombok.version>1.18.2</lombok.version> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-client</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>${drools.version}</version> </dependency>
2.Java整合
框架: spring-boot 、Lombok
@Data public class Person { private String name; private int age; }
3.drl文件的编写,resources下创建rules目录,并编写
import com.mkun.drools.bean.Person; //导入对应bean [?*] dialect "mvel" rule "drools-test" when $person: Person(age < 16 || age > 50) then System.out.println("该人员年龄不符合规则"); end
在对应路径添加Kie文件,resources下创建META-INF文件夹,并且创建文件kmodule.xml
<kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="rules"> <ksession name="all-rules"/> </kbase> </kmodule>
4.编写Test测试
@RunWith(SpringRunner.class) @SpringBootTest public class DroolsApplicationTests { private static KieContainer container = null; private KieSession statefulKieSession = null; @Test public void contextLoads() { KieServices services = KieServices.Factory.get(); container = services.getKieClasspathContainer(); statefulKieSession = container.newKieSession("all-rules"); Person person = new Person(); person.setAge(15); person.setName("Drools"); statefulKieSession.insert(person); statefulKieSession.fireAllRules(); statefulKieSession.dispose(); } }
5.动态加载规则
@RunWith(SpringRunner.class) @SpringBootTest public class DroolsApplicationTests { private static KieContainer container = null; private KieSession statefulKieSession = null; @Test public void contextLoads() { String myRule = "import com.asiainfo.bean.Person\n" + "\n" + "dialect \"mvel\"\n" + "\n" + "rule \"age\"\n" + " when\n" + " $person : Person(age<16 || age>50)\n" + " then\n" + " System.out.println(\"这个人的年龄不符合要求!(基于动态加载)\");\n" + "end\n"; KieHelper helper = new KieHelper(); helper.addContent(myRule, ResourceType.DRL); KieSession ksession = helper.build().newKieSession(); Person person = new Person(); person.setAge(12); person.setName("Test"); ksession.insert(person); ksession.fireAllRules(); ksession.dispose(); } }
上述测试说明Drools可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。
汇总:Drools动态加载规则,可以把规则存储至数据库中,然后动态加载规则生成drl文件
郭慕荣博客园