首页 > 其他分享 >Drools与动态加载规则文件

Drools与动态加载规则文件

时间:2024-07-26 15:18:12浏览次数:10  
标签:Drools Person drools private person 规则 动态 加载

Drools与动态加载规则文件

 

Drools简介

Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。

规则引擎实现了业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入、解释业务规则,以及基于业务规则做出业务决策,从而提供极大的编程便利。

对系统使用人员来说:

  • 将业务规则的创建、修改、维护透明话;
  • 提高业务灵活度;
  • 减少对开发人员的依赖;
  • 避免业务升级带来的风险

对开发人员来说:

  • 增加代码灵活性;
  • 降低系统维护成本,提高系统可维护性;
  • 解耦业务与规则,减少代码修改成本;
  • 简化系统架构,优化应用结构;

Drools架构图

在这里插入图片描述

快速开始

1. Maven导入

  <drools.version>7.23.0.Final</drools.version>
<lombok.version>1.18.2</lombok.version>

<dependency>
        <groupId>org.kie.server</groupId>
        <artifactId>kie-server-client</artifactId>
        <version>${drools.version}</version>
</dependency>

<dependency>
  <groupId>org.drools</groupId>
  <artifactId>drools-compiler</artifactId>
  <version>${drools.version}</version>
</dependency>
 

2.Java整合
框架: spring-boot 、Lombok

@Data
public class Person {
private String name;
private int age;
}
 

3.drl文件的编写,resources下创建rules目录,并编写

import  com.mkun.drools.bean.Person;  //导入对应bean [?*]
dialect  "mvel"

rule "drools-test"
when
     $person: Person(age < 16 || age > 50)
then
     System.out.println("该人员年龄不符合规则");
end
 

在对应路径添加Kie文件,resources下创建META-INF文件夹,并且创建文件kmodule.xml

<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="rules">
    <ksession name="all-rules"/>
</kbase>
</kmodule>

4.编写Test测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {

private static KieContainer container = null;
private KieSession statefulKieSession = null;


@Test
public void contextLoads() {
    KieServices services = KieServices.Factory.get();
    container = services.getKieClasspathContainer();
    statefulKieSession = container.newKieSession("all-rules");
    Person person = new Person();
    person.setAge(15);
    person.setName("Drools");

    statefulKieSession.insert(person);
    statefulKieSession.fireAllRules();
    statefulKieSession.dispose();
}
}
 

在这里插入图片描述
5.动态加载规则

@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationTests {

private static KieContainer container = null;
private KieSession statefulKieSession = null;


@Test
public void contextLoads() {
    String myRule = "import com.asiainfo.bean.Person\n" +
            "\n" +
            "dialect  \"mvel\"\n" +
            "\n" +
            "rule \"age\"\n" +
            "    when\n" +
            "        $person : Person(age<16 || age>50)\n" +
            "    then\n" +
            "        System.out.println(\"这个人的年龄不符合要求!(基于动态加载)\");\n" +
            "end\n";
    KieHelper helper = new KieHelper();
    helper.addContent(myRule, ResourceType.DRL);
    KieSession ksession = helper.build().newKieSession();
    Person person = new Person();
    person.setAge(12);
    person.setName("Test");
    ksession.insert(person);
    ksession.fireAllRules();
    ksession.dispose();

}
}
 

上述测试说明Drools可以基于字符串配置规则,那么我们在开发时就可以将自己配置的规则存到数据库等存储介质中,实时调用动态加载配置规则。

在这里插入图片描述

示例demo和相关学习资料会同步上传,需要的同学移步下。谢谢支持!!!!
添加 回复 “drools-demo” 获取示例代码
在这里插入图片描述

标签:Drools,Person,drools,private,person,规则,动态,加载
From: https://www.cnblogs.com/myqs-java/p/18325448

相关文章

  • Tkinter动态标签显示
    我正在研究简单的窗口,喜欢在里面有时钟。了解如何在单独的窗口中动态显示时间:不知何故,放入我的项目中的相同代码仅显示标签的紫色背景:deftime():string=strftime('%H:%M:%S%p')lbl.config(text=string)lbl.after(1000,time)classMainWindow(......
  • 可以捕捉高动态范围成像的的AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CS
    AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CSSC18SMEA0-DPBR图像传感器——明佳达1、AR0521SR2C09SURA0-DP2是一款1/2.5英寸CMOS数字图像传感器,带有2592(H)×1944(V)有效像素阵列。它能在线性或高动态范围模式下捕捉图像,且带有卷帘快门读取,其中包含了复杂......
  • 能耗动态监测系统方案:助力工厂节能降耗的有效手段
    在当今工业生产中,能耗问题一直是工厂管理者关注的焦点。过高的能耗不仅增加了生产成本,还对环境造成了负面影响。为了解决这一问题,能耗动态监测系统方案应运而生。一、方案简介该方案主要包括能耗监测、控制柜监测、安全监测和故障及时上报等功能。通过对工厂内电表、水表......
  • 根据路线在 Angular 中动态突出显示活动菜单项
    要在Angular应用程序中根据当前路由动态突出显示活动菜单项,您可以使用Angular的内置Router模块。这允许您将类应用于活动链接。以下是具体操作方法。步骤1.导入RouterModule确保已在Angular模块(通常是app.module.ts)中配置了RouterModule。import{RouterMo......
  • Abaqus施加恒定载荷:选择静态分析步还是动态分析步?
    Abaqus施加恒定载荷用静态还是动态分析步?在探究这个问题前,我们先来搞清楚什么叫恒定载荷。在Abaqus中,恒定载荷是指在整个分析过程中保持不变的载荷。这意味着在应用恒定载荷时,加载大小和方向将保持不变,直到分析结束或者手动更改为其他载荷类型。恒定载荷通常用于模拟静态加载情......
  • 代码随想录算法训练营第44天 | 动态规划9:买卖股票总结
    188.买卖股票的最佳时机IVhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/代码随想录https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课309.最佳买卖股票时机含冷冻期https://leetcode.cn/problems/best-time-to-buy-a......
  • t4模板无法加载文件或程序集system.runtime
        在.net6.0环境下使用T4模板生成代码报错错误正在运行转换:System.IO.FileNotFoundException:未能加载文件或程序集“System.Runtime,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。......
  • DevExtreme框架由于数据量太大,加载太慢,采用分页方式进行处理(基本上所有的操作都从客户
    首先我们需要引入官方的一个函数:importCustomStorefrom'devextreme/data/custom_store';我们需要通过这个函数去处理交互数据 先放个图: 上图中跟分页有关的属性分别是:1.:data-source="store",这个是存放数据源用的,需要用到我们上面的CustomStore函数,2.:remote-oper......
  • 如何将相对路径设置为解释器路径 xlwings 自定义加载项
    我使用xlwings制作了自定义加载项。我有一本字典,其中:phodnota.py、phodnota.xlam和Python311(带有python解释器和所有需要的库的字典)。问题是,当我尝试添加到解释器路径相对路径Python311\python.exe时,它​​不起作用。我不断收到错误。我找不到......
  • numpy 已安装,但出现错误“导入 _multiarray_umath 时 DLL 加载失败:找不到指定的模块。
    我使用的是带有Python3.9的Anaconda发行版。在安装的软件包中,我有numpy、pandas等。在PyCharmIDE中,我将ProjectInterpreter设置为与Anaconda一起安装的python.exe的路径:C:\Users\[user]\anaconda3\envs[Tensorflow]\pythonw.exeP.S:我已经尝试了各种方法来解决堆栈溢......