本文主要对Drools的使用业务场景做简单介绍。
规则引擎:全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。 需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。 目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。 规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。
drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、不用重启服务器就可以在线上环境立即生效。
drools官网地址
:https://drools.org/
drools源码下载地址
:https://github.com/kiegroup/drools
drools规则引擎由以下三部分构成:
Working Memory
:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可;Rule Base
:规则库,我们在规则文件中定义的规则
都会被加载到规则库中Inference Engine
:推理引擎
其中Inference Engine(推理引擎)又包括:Fact:事实,是指在drools 规则应用当中,**将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象**,Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。
规则引擎执行过程
目录结构:
注意这里在properties标签中设置版本
<properties>
<java.version>1.8</java.version>
<drools.version>7.28.0.Final</drools.version>
</properties>
<!-- start drools -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-internal</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.35.0.Final</version>
</dependency>
<!-- end drools -->
src/main/resources/META-INF
目录下新建文件kmodule.xml
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.drools.org/xsd/kmodule">
<!--
可以存在多个<kbase>标签;
name属性值可以随意设置;
packages:对应*.drl文件的resources路径
ksession标签必须设置;一个或者多个标签,name属性值唯一
-->
<kbase name="test-rulesKB" packages="rules">
<ksession name="test-rulesKS"/>
</kbase>
</kmodule>
test.drl
文件package rules
import com.qxy.drools.Customer
rule "customerAge"
no-loop true // 定义当前的规则是否 不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行
lock-on-active true //将lock-on-active属性的值设置为true,可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行。
salience 1
when
$customer:Customer(age < 10)
then
$customer.setAge($customer.getAge() + 1);
update($customer)
System.out.println($customer.getName() + ",age:" + $customer.getAge());
end
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
/**
* @author qxy
* @date 2020/11/11 11:31 上午
*/
public class DroolTest {
public static void main(String[] args) {
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession ksession = kc.newKieSession("test-rulesKS");
Customer customer1 = new Customer();
customer1.setAge(1);
customer1.setName("李三");
Customer customer2 = new Customer();
customer2.setAge(18);
customer2.setName("李四");
ksession.insert(customer1);
ksession.insert(customer2);
ksession.fireAllRules();
ksession.dispose();
}
}
整理的这份超全Java面试题包含: Java基础、Java异常、Spring、SpirngMVC、MyBatis、SpringBoot、SpringCloud、BIO、NIO、AIO、Netty、Tomcat、Redis、MySQL、Memcache、ElasticSearch、zookeeper、RabbitMQ、Vue、Dubbo、并发编程、Java虚拟机、TCP、Http、大数据、设计模式、Linux等
公众号Java专栏,后台回复【面试66】。即可获取! 或者点击下方超链接: 史上最全Java面试题,41个方向!一网打尽!