温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot2中如何整合Drools规则引擎

发布时间:2022-04-06 15:45:30 来源:亿速云 阅读:416 作者:iii 栏目:移动开发

本文小编为大家详细介绍“SpringBoot2中如何整合Drools规则引擎”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot2中如何整合Drools规则引擎”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、Drools引擎简介

1、基础简介

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

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

SpringBoot2中如何整合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、配置文件

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

@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() ;
  }
}

读到这里,这篇“SpringBoot2中如何整合Drools规则引擎”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI