美文网首页规则引擎
135 dtools规则引擎学习使用

135 dtools规则引擎学习使用

作者: 滔滔逐浪 | 来源:发表于2020-05-25 16:24 被阅读0次

https://www.jianshu.com/p/0209eb5bebb1

一、dtools在风控系统中的作用
我们的风控系统主要作用是在功能系统前进行拦截,比如同一IP地址1分钟内只准登录3次、同一账号只准绑定的设备号为3个等。在这前提下需要有多个规则进行校验,本系统就是使用dtool工具来执行规则引擎的。

二、dtool简单demo使用
2.1 创建maven项目,包结构如下:


image.png

2.2 pom.xml引入

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.taotao</groupId>
    <artifactId>drooldemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>drooldemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <drools.version>6.1.0.Final</drools.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>



2.2 编写规则
规则文件放在resources下rules文件夹下

package rules
//package 是规则文件在resource的位置
import com.taotao.drooldemo.po.Stu;
//导入java文件
rule "rule1"
    salience 1
        when
            $stu:Stu(age>30)//这里就是LHS
        then
            System.out.println("age>30岁的人:"+$stu.getName());//RHS
end


rule "rule2"
    salience 2
    when
         $stu:Stu(gender=="male",age>25)
    then
        System.out.println("性别为男,age>25岁的人:"+$stu.getName());
     end


rule "rule3"
     salience 3
     when
        $stu:Stu(getName()=="张三")
        then
         System.out.println("名字为:"+$stu.getName());
        end








2.3 实体类bean

package com.taotao.drooldemo.po;

/**
 * @author aping
 * @time 2020/5/25 15:44
 */
public class Stu {
    private String name;
    private Integer age;
    private String gender;

    public Stu() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "Stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }

    public Stu(String name, Integer age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}







2.4 测试类

package com.taotao.drooldemo.app;
import com.taotao.drooldemo.po.Stu;
import org.drools.core.io.impl.ClassPathResource;
import org.drools.core.marshalling.impl.ProtobufMessages;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.runtime.StatefulKnowledgeSession;


import java.util.ArrayList;
import java.util.Collection;
import java.util.List;


/**
 * @author aping
 * @time 2020/5/25 15:44
 */
public class StuTest {
    private  static KieContainer container=null;
    private static KieSession statefuKieSession =null;

    public static void main(String[] args) {
        //规则编译器
        KnowledgeBuilder kb=KnowledgeBuilderFactory.newKnowledgeBuilder();
       //添得到加规则并并编译
        kb.add(new ClassPathResource("rules/stu.drl"),ResourceType.DRL);
        //得到规则包
        Collection<KnowledgePackage> collection=kb.getKnowledgePackages();
        //创建base
        KnowledgeBase knowledgeBase=KnowledgeBaseFactory.newKnowledgeBase();
        //加入包
        knowledgeBase.addKnowledgePackages(collection);
        //得到session
        StatefulKnowledgeSession statefulKnowledgeSession=knowledgeBase.newStatefulKnowledgeSession();
        List<Stu> list=getStus();
        for (Stu stu: list){
            //插入fact对象
            statefulKnowledgeSession.insert(stu);
        }
        statefulKnowledgeSession.fireAllRules();
        statefulKnowledgeSession.dispose();
        System.out.println("end。。。。");
    }

    public  static  List<Stu> getStus(){
        List<Stu> stus = new ArrayList<>();
        stus.add(new Stu("张三", 16, "male"));
        stus.add(new Stu("huhu", 18, "male"));
        stus.add(new Stu("王五", 32, "male"));
        stus.add(new Stu("张红", 23, "female"));
        stus.add(new Stu("李四", 35, "male"));
        stus.add(new Stu("张小雅", 31, "female"));
        return stus;
    }
}









2.5 结果


名字为:张三
性别为男,age>25岁的人:李四
性别为男,age>25岁的人:王五
age>30岁的人:张小雅
age>30岁的人:李四
age>30岁的人:王五
end。。。。



相关文章

  • 135 dtools规则引擎学习使用

    https://www.jianshu.com/p/0209eb5bebb1 一、dtools在风控系统中的作用我...

  • 风控系统二:storm伪集群环境安装

    一、storm集群在风控系统中作用 在风控系统一:dtools规则引擎学习使用中描述了风控系统的做,比如说限制同一...

  • 风控系统一:dtools规则引擎学习使用

    一、dtools在风控系统中的作用 我们的风控系统主要作用是在功能系统前进行拦截,比如同一IP地址1分钟内只准登录...

  • 规则引擎的优缺点

    为何要使用规则引擎? 讨论规则引擎时,下边这些问题经常被提及: 什么时候应当使用规则引擎? 相较与使用使用“if....

  • 规则引擎学习

    背景: 使软件可维护,适应业务变化不要经常改代码。 在没有规则引擎的时代,有些逻辑比较复杂的业务,只有不断的增添i...

  • 《PHP Learning》模板引擎

    《PHP Learning》模板引擎 模板处理使用正则处理模板替换规则保存模板编译结果 模板使用 自定义模板引擎 ...

  • 谈一谈规则引擎在活动系统中的落地

    本文从 “为什么需要规则引擎” “规则引擎的定义” “规则引擎在营销活动系统中的落地” “规则引擎平台内部架构” ...

  • Drools规则引擎学习

    引言 规则引擎实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。 规则引擎具体执行可以...

  • 信贷风控实战(二)——策略生成及规则挖掘

      在信贷风控领域有两种比较常见的风险规避手段,分别是规则引擎和风控模型。通常规则引擎是使用一组简单的规则判断逻辑...

  • # 规则引擎使用配置介绍

    配置实例 本篇提供两个示例,通过 Dashboard 可视化界面演示规则引擎的创建于使用。 示例一:通过 Web ...

网友评论

    本文标题:135 dtools规则引擎学习使用

    本文链接:https://www.haomeiwen.com/subject/jxgyahtx.html