Drools规则引擎使用

Drools规则引擎

项目Github地址
如果使用硬编码来实现业务规则的话,不容易维护,不容易应对变化,改变的话需要重启服务器才能生效.
规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎有三部分构成

  • Working Memory(工作内存)
  • Rule Base(规则库)
  • Inference Engine(推理引擎)

(file-settings-plugins)加入插件对JBoss Drools的支持
Drools规则引擎使用_第1张图片
入门案例
添加需要的jar包坐标

<!-- https://mvnrepository.com/artifact/org.drools/drools-compiler -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.23.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>6.5.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.23.0.Final</version>
        </dependency>

加入drools规则引擎的配置文件

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.Resource;

import java.io.IOException;

@Configuration
public class KiaSessionConfig {

    private static final String RULES_PATH = "rules/";

    @Bean
    public KieFileSystem kieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
        for (Resource file : getRuleFiles()) {
            kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
        }
        return kieFileSystem;
    }

    private Resource[] getRuleFiles() throws IOException {

        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        final Resource[] resources = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
        return resources;

    }

    @Bean
    public KieContainer kieContainer() throws IOException {

        final KieRepository kieRepository = getKieServices().getRepository();
        kieRepository.addKieModule(new KieModule() {
            public ReleaseId getReleaseId() {
                return kieRepository.getDefaultReleaseId();
            }
        });

        KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
        kieBuilder.buildAll();
        return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());

    }

    private KieServices getKieServices() {
        return KieServices.Factory.get();
    }

    @Bean
    public KieBase kieBase() throws IOException {
        return kieContainer().getKieBase();
    }

    @Bean
    public KieSession kieSession() throws IOException {
        return kieContainer().newKieSession();
    }
}

POJO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private int age;
}
  • 在resources资源下创建rules文件夹,存放规则文件*.drl
    在这里插入图片描述
    编写规则文件
    匹配person年龄小于18岁的
package rules

import com.drools.pojo.Person
import javafx.beans.binding.When

rule "Person"
    when
        $person : Person(age < 18)
    then
        System.out.println($person.getUserName()+"年龄不到成年条件");
end

测试

 @Resource
    private PersonMapper personMapper;
    @Resource
    private KieSession kieSession;
    
    @Test
    void testFindByAge() {
        List<Person> people = personMapper.selectAll();
        for (Person person : people) {
            // 将数据提供给规则引擎,进行匹配
            kieSession.insert(people);
        }
        // 激活规则引擎
        kieSession.fireAllRules();
        // 关闭会话
        kieSession.dispose();
    }

查看结果,找出了数据中符合规则的数据
Drools规则引擎使用_第2张图片

Drools基础语法

规则文件构成 *.drl

关键字 描述
package 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用
import 用于导入类或者静态方法
global 全局变量
function 自定义函数
query 查询
rule end 规则体

规则体语法结构
Drools规则引擎使用_第3张图片
Pattern模式匹配: 结构: 绑定变量名:Object(Field约束)
绑定的变量名可以在RHS规则结果使用(对象,变量)
Drools规则引擎使用_第4张图片
Drools提供的比较操作符
Drools规则引擎使用_第5张图片
Drools规则引擎使用_第6张图片
执行指定规则
new RuleNameEqualsAgendaFilter(“规则名称”)
Drools规则引擎使用_第7张图片
Drools内置方法

  • update
    Drools规则引擎使用_第8张图片
  • insert
  • retract 删除工作内存中的数据,并让相关的规则重新匹配。

规则格式

rule "ruleName"
    attributes
    when
        LHS
    then
        RHS
end

attributes属性
Drools规则引擎使用_第9张图片
enabled 测试
Drools规则引擎使用_第10张图片

1.global全局变量
Drools规则引擎使用_第11张图片
Drools规则引擎使用_第12张图片
2. query查询

query 查询的名称(可选参数)
    LHS
end

带参,不带参
Drools规则引擎使用_第13张图片
Drools规则引擎使用_第14张图片
** function函数**

  • 结构
function 返回值类型 函数名(可选参数){
    //逻辑代码
}

成功触发了自定义的函数
Drools规则引擎使用_第15张图片
LHS

  • 复合值in/not in
    $person : Person(userName in (“张三”,“李四”,“王五”))
  • 条件元素eval,返回一个Boolean值
    eval(1 == 1)
  • not 判断是否存在某个Fact对象,不存在返回true
    not Person()
  • exists 判断是否存在某个Fact对象,存在返回true
    exists Person()
  • 规则继承extends
    Drools规则引擎使用_第16张图片
    RHS
  1. halt() 立即终止后面所有规则的执行
    Drools规则引擎使用_第17张图片
  2. getWorkingMemory返回工作内存对象。
    Drools规则引擎使用_第18张图片
  3. getRule() 返回规则对象。
    Drools规则引擎使用_第19张图片

使用规范

Drools规则引擎使用_第20张图片

你可能感兴趣的:(Drools规则引擎使用)