SpringBoot2整合Drools规则引擎及案例详解

网友投稿 494 2022-12-24


SpringBoot2整合Drools规则引擎及案例详解

一、Drools引擎简介

1、基础简介

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

2、规则语法

(1)、演示drl文件格式

package droolRule ;

import org.slf4j.Logger

import 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 整合 Drools规则引擎,实现高效的业务规则

2、核心依赖

org.drools

drools-core

7.6.0.Final

org.drools

drools-compiler

7.6.0.Final

org.drools

drools-templates

7.6.0.Final

org.kie

kie-api

7.6.0.Final

org.kie

kie-spring

7.6.0.Final

3、配置文件

@Configuration

public 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 = kieSeQujOXrvices.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、规则执行代码

@Service

public 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-parent

GitEE地址

https://gitee.com/cicadasmile/middle-ware-parent


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java线程封闭之栈封闭和ThreadLocal
下一篇:springboot向elk写日志实现过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~