Drools规则引擎使用

Drools规则引擎

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

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

(file-settings-plugins)加入插件对JBoss Drools的支持
在这里插入图片描述
入门案例
添加需要的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基础语法

规则文件构成 *.drl

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

规则体语法结构
在这里插入图片描述
Pattern模式匹配: 结构: 绑定变量名:Object(Field约束)
绑定的变量名可以在RHS规则结果使用(对象,变量)
在这里插入图片描述
Drools提供的比较操作符
在这里插入图片描述
在这里插入图片描述
执行指定规则
new RuleNameEqualsAgendaFilter(“规则名称”)
在这里插入图片描述
Drools内置方法

  • update
    在这里插入图片描述
  • insert
  • retract 删除工作内存中的数据,并让相关的规则重新匹配。

规则格式

rule "ruleName"
    attributes
    when
        LHS
    then
        RHS
end

attributes属性
在这里插入图片描述
enabled 测试
在这里插入图片描述

1.global全局变量
在这里插入图片描述
在这里插入图片描述
2. query查询

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

带参,不带参
在这里插入图片描述
在这里插入图片描述
** function函数**

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

成功触发了自定义的函数
在这里插入图片描述
LHS

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

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值