Drools-规则引擎简单介绍

9,160 阅读4分钟

Drools-在我同学没有跟我说的时候,我都没有听过这个东西,都不知道它是做什么的,于是深夜补充干粮....

Drools介绍

Drools简单来说就是规则,他为了规则而生。有些复杂多变的业务场景,仅仅靠我们日常的判断处理是不够的,规则是变化很快的,随着不可控因素(天气,日期,活动等等),规则也是随之变化,而项目是不可能随之而变更上线的。

而Drools中是符合当前的业务场景变化的规则引擎之一。一旦数据满足条件匹配,则会执行对应的逻辑处理:

when 满足什么样的条件
then 最终的结果

为什么需要规则介入

在一些简单并且业务量不复杂的系统中,仅仅只需要条件语句判断一下就好了,没必要引入规则引擎。但是针对于一个庞大的业务场景以及可能每天每个时间点都会有不同规则介入的项目来说,这个是不满足当前的情况的。只会让开发人员以及产品人员头痛。

业务规则往往遵循以下的原则:

  • 它们是独立的
  • 它们很容易更新
  • 每个规则控制所需的最小信息量
  • 它们允许不同背景的人进行合作

Drl执行流程

Drools规则引擎将业务规则转换成执行树:

每个规则条件分为小块,在树结构中连接和重用。每次将数据添加到规则引擎中时,它将在与此类似的树中进行求值,并到达一个动作节点,在该节点处,它们将被标记为准备执行特定规则的数据。

简单Demo介绍

我这边本地简单的实现了一个小的Demo,里面就是对于当前的规则引擎的一个简单的使用介绍情况。

当前项目目录层次

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── montos
│   │   │           ├── DroolsStartApplication.java
│   │   │           ├── controller
│   │   │           │   └── TestController.java
│   │   │           ├── entity
│   │   │           │   └── Message.java
│   │   │           ├── impl
│   │   │           │   └── DroolsServiceImpl.java
│   │   │           └── service
│   │   │               └── DroolsService.java
│   │   └── resources
│   │       ├── META-INF
│   │       │   └── kmodule.xml
│   │       └── rules
│   │           └── Helloworld.drl
│   └── test
│       └── java
└── target
    ├── classes
    │   ├── META-INF
    │   │   └── kmodule.xml
    │   ├── com
    │   │   └── montos
    │   │       ├── DroolsStartApplication.class
    │   │       ├── controller
    │   │       │   └── TestController.class
    │   │       ├── entity
    │   │       │   └── Message.class
    │   │       ├── impl
    │   │       │   └── DroolsServiceImpl.class
    │   │       └── service
    │   │           └── DroolsService.class
    │   └── rules
    │       └── Helloworld.drl
    └── generated-sources
        └── annotations

pom.xml依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

serviceImpl类

public class DroolsServiceImpl implements DroolsService {

    @Override
    public String fireRule() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kContainer = ks.getKieClasspathContainer();
        KieSession kSession = kContainer.newKieSession("ksession-rules");

        Message message = new Message();
        message.setMessage("Good Bye");
        message.setStatus(Message.GOODBYE);
        kSession.insert(message);//插入
        kSession.fireAllRules();//执行规则
        kSession.dispose();
        return message.getMessage();

    }
}

kmodule.xml

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>

Helloworld.drl

package com.montos.drools.test1 #虚拟包名,不一定需要与物理存在的包名一致
import com.montos.entity.Message
dialect  "mvel" # 方言  默认是java

rule "Hello World" # 规则名
    dialect "mvel"
    when
        m : Message(status.equals(Message.HELLO), message : message )#条件
    then
        System.out.println( message);#动作
    modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE }; //更新语句,会导致引擎重新检查所有规则是否匹配条件,而不管其之前是否执行过
end

rule "Good Bye"
    dialect "java"
    when
       Message( status == Message.GOODBYE, message : message )
    then
        System.out.println( message );
end

上面的就简单的介绍了部分重要的代码,里面如果执行的话,主要看service的实现类里面的逻辑,获取配置的规则策略,然后根据drl文件中的规则策略进行跑结果。

上面对于当前的Drools简单介绍,关于这方面的资料网上大多数都是对于简单的Api介绍以及类似当前的介绍,对于复杂的业务场景的Demo是没有的。有资料的小伙伴可以留言分享下给我,不胜感激。

文章中部分资料转载自:blog.csdn.net/chinrui/art…