文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot2 高级应用(14): 整合 Drools规则引擎,实现高效的业务规则

2023-06-02 12:43

关注

本文源码:GitHub·点这里 || GitEE·点这里

一、Drools引擎简介

1、基础简介

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。具有易于访问企业策略、易于调整以及易于管理的特点,作为开源业务规则引擎,符合业内标准,速度快、效率高。

2、规则语法

(1)、演示drl文件格式

package droolRule ;import org.slf4j.Loggerimport org.slf4j.LoggerFactory ;dialect  "java"rule "paramcheck1"    when     then        final Logger LOGGER = LoggerFactory.getLogger("param-check-one 规则引擎") ;        LOGGER.info("参数");end

(2)、语法说明

· 文件格式可以 .drl、xml文件,也可以Java代码块硬编码;· package规则文件中,package是必须定义的,必须放在规则文件第一行;· import规则文件使用到的外部变量,可以是一个类,也可以是类中的可访问的静态方法;· rule定义一个规则。paramcheck1规则名。规则通常包含三个部分:属性、条件、结果;

二、整合SpringBoot框架

1、项目结构

SpringBoot2 高级应用(14): 整合 Drools规则引擎,实现高效的业务规则

2、核心依赖

<!--drools规则引擎--><dependency>    <groupId>org.drools</groupId>    <artifactId>drools-core</artifactId>    <version>7.6.0.Final</version></dependency><dependency>    <groupId>org.drools</groupId>    <artifactId>drools-compiler</artifactId>    <version>7.6.0.Final</version></dependency><dependency>    <groupId>org.drools</groupId>    <artifactId>drools-templates</artifactId>    <version>7.6.0.Final</version></dependency><dependency>    <groupId>org.kie</groupId>    <artifactId>kie-api</artifactId>    <version>7.6.0.Final</version></dependency><dependency>    <groupId>org.kie</groupId>    <artifactId>kie-spring</artifactId>    <version>7.6.0.Final</version></dependency>

3、配置文件

@Configurationpublic class RuleEngineConfig {    private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineConfig.class) ;    private static final String RULES_PATH = "droolRule/";    private final KieServices kieServices = KieServices.Factory.get();    @Bean    public KieFileSystem kieFileSystem() throws IOException {        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();        Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");        String path = null;        for (Resource file : files) {            path = RULES_PATH + file.getFilename();            LOGGER.info("path="+path);            kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));        }        return kieFileSystem;    }    @Bean    public KieContainer kieContainer() throws IOException {        KieRepository kieRepository = kieServices.getRepository();        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());        kieBuilder.buildAll();        return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());    }    @Bean    public KieBase kieBase() throws IOException {        return kieContainer().getKieBase();    }    @Bean    public KieSession kieSession() throws IOException {        return kieContainer().newKieSession();    }    @Bean    public KModuleBeanFactoryPostProcessor kiePostProcessor() {        return new KModuleBeanFactoryPostProcessor();    }}

这样环境整合就完成了。

三、演示案例

1、规则文件

  • 规则一
    dialect  "java"rule "paramcheck1"  salience 99  when queryParam : QueryParam(paramId != null && paramSign.equals("+"))      resultParam : RuleResult()  then      final Logger LOGGER = LoggerFactory.getLogger("param-check-one 规则引擎") ;      LOGGER.info("参数:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign());      RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ;      ruleEngineService.executeAddRule(queryParam);      resultParam.setPostCodeResult(true);end
  • 规则二
    dialect  "java"rule "paramcheck2"  salience 88  when queryParam : QueryParam(paramId != null && paramSign.equals("-"))      resultParam : RuleResult()  then      final Logger LOGGER = LoggerFactory.getLogger("param-check-two 规则引擎") ;      LOGGER.info("参数:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign());      RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ;      ruleEngineService.executeRemoveRule(queryParam);      resultParam.setPostCodeResult(true);end

规则说明:

A、salience 的值越大,越优先执行;

B、规则流程:如果paramId不为null,参数标识是+号,执行添加规则,-号,执行移除规则操作。

2、规则执行代码

@Servicepublic class RuleEngineServiceImpl implements RuleEngineService {    private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineServiceImpl.class) ;    @Override    public void executeAddRule(QueryParam param) {        LOGGER.info("参数数据:"+param.getParamId()+";"+param.getParamSign());        ParamInfo paramInfo = new ParamInfo() ;        paramInfo.setId(param.getParamId());        paramInfo.setParamSign(param.getParamSign());        paramInfo.setCreateTime(new Date());        paramInfo.setUpdateTime(new Date());        ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;        paramInfoService.insertParam(paramInfo);    }    @Override    public void executeRemoveRule(QueryParam param) {        LOGGER.info("参数数据:"+param.getParamId()+";"+param.getParamSign());        ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;        ParamInfo paramInfo = paramInfoService.selectById(param.getParamId());        if (paramInfo != null){            paramInfoService.removeById(param.getParamId()) ;        }    }}

3、规则调用接口

@RestController@RequestMapping("/rule")public class RuleController {    @Resource    private KieSession kieSession;    @Resource    private RuleEngineService ruleEngineService ;    @RequestMapping("/param")    public void param (){        QueryParam queryParam1 = new QueryParam() ;        queryParam1.setParamId("1");        queryParam1.setParamSign("+");        QueryParam queryParam2 = new QueryParam() ;        queryParam2.setParamId("2");        queryParam2.setParamSign("-");        // 入参        kieSession.insert(queryParam1) ;        kieSession.insert(queryParam2) ;        kieSession.insert(this.ruleEngineService) ;        // 返参        RuleResult resultParam = new RuleResult() ;        kieSession.insert(resultParam) ;        kieSession.fireAllRules() ;    }}

这样,完整的案例就结束了。

四、源代码地址

GitHub·地址https://github.com/cicadasmile/middle-ware-parentGitEE·地址https://gitee.com/cicadasmile/middle-ware-parent

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯