规则引擎Drools入门

规则引擎提供了一种集中化的知识,通过使用规则,您可以创建一个可执行的知识存储库,即知识库。这是商业策略的重点。理想情况下,规则非常具有可读性,它们也可以作为文档。

Drools 引擎存储、处理和评估数据,以执行您定义的业务规则或决策模型。Drools 引擎的基本功能是将传入的数据或事实与规则的条件相匹配,并确定是否以及如何执行这些规则。

Drools 基本组件

Rules

定义的业务规则或 DMN 决策。所有规则必须至少包含触发规则的条件和规则指示的操作。

Facts

输入到 Drools 引擎或与 Drools 引擎匹配的 Drools 引擎中的数据会转换为规则条件,以执行适用的规则。

Production memory

规则存储在 Drools 引擎中的位置。

Working memory

Facts 存储在 Drools 引擎中的位置。

Agenda

已激活规则被注册和排序(如果适用)以准备执行的位置。

当业务用户或自动化系统在 Drools 中添加或更新与规则相关的信息时,这些信息将以一个或多个 Facts 的形式插入到 Drools 引擎的工作内存中。Drools 引擎将这些 Facts 与 Production memory 中的规则的条件进行匹配,以确定符合条件的规则执行(将事实与规则相匹配的过程)。

规则引擎 Drools入门

为什么使用 Drools 规则引擎

逻辑和数据分离

将域对象从业务规则中分离出来可以使应用程序的维护更加容易,因为它可以避免将来发生更改,因为逻辑都是在规则中列出的。

可伸缩性

Drools 使您的应用程序具有可伸缩性。如果发生任何频繁的更改请求,您可以轻松地添加新规则,而无需修改现有规则。

集中的知识库

规则引擎提供了一种集中化的知识,通过使用规则,您可以创建一个可执行的知识存储库,即知识库。这是商业策略的重点。理想情况下,规则非常具有可读性,它们也可以作为文档。 声明式编程

规则引擎使您可以定义“该做什么”而不是“如何执行此操作”。与代码不同,规则以不太复杂的语言编写,使任何业务分析师或新开发人员更容易理解和验证一组规则。使用规则,它们可以轻松地表达对复杂问题的解决方案并获得更好的解决方案。

什么是规则?

规则是常被表示为“当某些情况发生时,然后执行一些任务”的知识。规则引擎允许您定义“做什么”而不是“如何做”。

When

<Condition is true>

Then

<Take desired Action>

规则最重要的部分是其 When 部分。如果满足 When 部分,则触发 Then 部分。

rule  <rule_name>

<attribute> <value>

when

<conditions>

then

<actions>

end

模式匹配

将新事实或现有事实与生产规则进行匹配的过程称为模式匹配,由推理引擎执行。有很多用于模式匹配的算法,包括 Linear、Rete、Treat、Lea。

Drools 实现并扩展了 Rete 算法,并表示针对面向对象系统的增强和优化的 Rete 算法实现,即 ReteOO 实现。

写规则

规则引擎 Drools入门

每个规则都以包名称开始。该包作为规则的命名空间。包中的规则名称必须是唯一的。规则中的包类似于 Java 中的包。

导入声明

无论您想要应用规则的任何事实,都需要导入这些事实。例如,
com.fg.drools.domain.VipDiscountPrice 在上面的例子中。

规则定义

由规则名称、条件和结果组成。Drools 关键字是 rule、when、then 和 end。when 部分在规则中都是条件,then 部分是结果。在规则术语中,when 部分也称为 LHS(左侧),then 部分称为 RHS(右侧)。

规则语法

规则条件

规则可以包含许多条件和模式,如:

Account (balance == 200)
Customer (name == "Vivek")

以上条件检查帐户余额是否为 200 或客户名称为 Vivek。

规则中的变量

Drools 中的变量名以美元($)符号开头:

$account − Account( )
$account is the variable for Account() class

Drools 可以与所有原生 Java 类型,甚至 Enum 一起工作。

全局变量

全局变量是分配给会话的变量:

  • 对于输入参数(例如,可以从会话与会话自定义的常规值)
  • 对于输出参数(例如,报告规则可以向全局报告变量写入一些消息)
  • 日志等服务的入口点,可以在规则中使用

方法

function double calculateSquare (double value) {
   return value * value;
}

规则结果关键字

规则结果关键字是规则 then 部分使用的关键字。

  • 修改:事实的属性可以在规则的那些部分中修改。
  • 插入:基于某些条件,如果为 true,则可以将新事实插入到规则引擎的当前会话中。
  • 收缩:如果规则中的特定条件是真的,并且您不想在该事实上执行其他任何操作,则可以从规则引擎撤回特定事实。

项目实例

需求:会员购买商品优惠规则设置,不同等级的会员购买不同类型商品的优惠比例不同。

源码:cfjgithub/fgpublic

项目结构

规则引擎 Drools入门

实现方式一:通过 drl 规则文件。

规则引擎 Drools入门

实现方式二:通过 xls 文件配置规则。

规则引擎 Drools入门

pom 文件中加入的依赖:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>com.fg.parent</artifactId>
        <groupId>com.fg</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mydrools</artifactId>
    <properties>
        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
        <http-component-version>4.4.6</http-component-version>
        <drools-version>7.49.0.Final</drools-version>
        <apache-poi-version>4.1.2</apache-poi-version>
        <org.slf4j.version>2.0.0-alpha2</org.slf4j.version>
        <logback.version>1.3.0-alpha5</logback.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <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.drools</groupId>
            <artifactId>drools-mvel</artifactId>
            <version>${drools-version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>7.57.0.Beta1</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-ci</artifactId>
            <version>${drools-version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

举报评论 1

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/procedure/24642.html

发表评论

登录后才能评论