美文网首页
基于Drools规则引擎实现动态接口,将业务逻辑放进数据库

基于Drools规则引擎实现动态接口,将业务逻辑放进数据库

作者: TinyThing | 来源:发表于2021-07-26 11:28 被阅读0次

0x0.基于Drools实现动态接口

项目已上传至github:
后端demo:https://github.com/gx304419380/drools-demo
前端:https://github.com/gx304419380/dynamic-drools-web
jar包:https://github.com/gx304419380/dynamic-rule
项目已经上传至maven中央仓库:

        <dependency>
            <groupId>com.github.gx304419380</groupId>
            <artifactId>dynamic-rule</artifactId>
            <version>1.0.3</version>
        </dependency>

0x1. 核心原理

利用Drools引擎的动态编译功能,根据规则字符串生成一个规则容器,进而获取session执行规则;
我们会在session中插入必要的工具类,例如spring的容器,jdbcTemplate等

KieContainer container = new KieHelper().addContent(rule, DRL).getKieContainer();
KieSession session = container.newKieSession();
//设置日志和spring容器
session.insert(log);
session.insert(context);
session.insert(jdbcTemplate);

其中规则类似如下,可以调用jdbc,redis,restTemplate以及获取Spring容器中的bean:

rule "discount_rule_4"
    when
        param: Param()
        r: RuleResult()
        log: Logger()
        context: ApplicationContext()
        jdbc: JdbcTemplate()
    then
        log.info("drools execute, param={}", param);
        TestService t = context.getBean(TestService.class);
        String res = t.test("123456");
        log.info("test spring context: {}", res);
        List<Rule> list = jdbc.query("select * from tb_rule", new BeanPropertyRowMapper<>(Rule.class));
        log.info("rule list = {}", list);
end

0x2.使用方法

2.1 引入maven依赖并配置

        <dependency>
            <groupId>com.github.gx304419380</groupId>
            <artifactId>dynamic-rule</artifactId>
            <version>1.0.3</version>
        </dependency>

在项目中添加@EnableDynamicRule注解,会引入相关配置,例如:

@SpringBootApplication
@EnableDynamicRule
public class MybatisDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisDemoApplication.class, args);
    }
}

2.2 配置数据库

例如:

spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

2.3 启动项目

启动项目后,可以看到项目自动建立了一个tb_rule
的表,用于保存用户配置的规则;
访问项目路径/dynamic-rule会自动跳转到动态规则配置页面,如下:

可以看到用户配置的动态规则列表


image.png

2.4 新增一个规则:

点击新增按钮进入新增规则页面,填写规则名称,规则说明以及规则代码即可;

其中drools规则代码可以在IDEA下编辑,因为IDEA天然支持DROOLS语法,有代码高亮和自动填充功能,很方便:


image.png

2.5 规则接口测试

规则编写完成后可以进行规则测试,点击右边测试按钮弹出测试框:
填写参数点击提交即可测试接口。


image.png

0x3. 使用场景:

对于易变的业务逻辑,比如经常需要定制的部分,可以将他们卸载规则中,然后使用动态接口或者DynamicService进行调用即可,只需要知道规则ID就能调用;
后续会优化规则调用方式为按名称调用,方便用户自定义规则名称进行调用。

相关文章

  • 基于Drools规则引擎实现动态接口,将业务逻辑放进数据库

    0x0.基于Drools实现动态接口 项目已上传至github:后端demo:https://github.com...

  • Drools介绍(1)

    Drools简介 Drools是一款基于Java的开源规则引擎,将规则与业务代码解耦。规则以脚本的形式存储在一个文...

  • Drools

    一. Drools规则引擎 Drools就是为了解决业务代码和业务规则分离的引擎。Drools 规则是在 Java...

  • Drools学习笔记

    Drools是一款基于Java的开源规则引擎 实现了将业务决策从应用程序中分离出来。 优点: 1、简化系统架构,优...

  • Drools集成SpringBootStarter

    1.说明 基于fast-drools-spring-boot-starter,能够方便的将规则引擎Drools集成...

  • 高性能,易用的规则引擎

    规则引擎很多人都听过,实现方案有很多: 1、用开源的方案 drools 基于 RETE 决策算法 2、基于groo...

  • drools 如何动态加载规则

    drools版本:7.0语言:java8描述:动态从数据库中加载规则,并且加载到工作内存中 最终实现效果:从数据库...

  • Drools入门-实现评分专家系统

    1.什么是Drools Drools是一个规则引擎,可以通过自定义规则实现不同的专家语境,而不需要修改源代码,规则...

  • drools 6.4

    一. 简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的...

  • 2020-09-28 风控系统六-drools规则引擎动态加载规

    一、简介 在前面介绍了使用drools加载规则来作为风控实现。使用drools后可以使业务和规则独立出来。 风控系...

网友评论

      本文标题:基于Drools规则引擎实现动态接口,将业务逻辑放进数据库

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