springboot 整合drools,drools规则读取数据库配置

maven:

        <dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>6.5.0.Final</version><scope>runtime</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>

sql:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for qms_rule
-- ----------------------------
DROP TABLE IF EXISTS `qms_rule`;
CREATE TABLE `qms_rule`  (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`rule_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '规则标识',`rule_condition` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '规则数据',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `uni_code`(`rule_code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of qms_rule
-- ----------------------------
INSERT INTO `qms_rule` VALUES (1, 'report_type_test', '[\"scheduling_cycle>12\",\"report_term_of_validity>12\",\"early_warning_period memberOf [5,10,30]\",\"code==\\\"report_type_test\\\"\"]');
INSERT INTO `qms_rule` VALUES (2, 'report_3c_test', '[\"scheduling_cycle>12\",\"report_term_of_validity>12\",\"early_warning_period memberOf [5,10,30]\",\"code==\\\"report_3c_test\\\"\"]');
INSERT INTO `qms_rule` VALUES (3, 'report_hazardous_substance_test', '[\"scheduling_cycle>12\",\"report_term_of_validity>12\",\"early_warning_period memberOf [5,10,30]\",\"code==\\\"report_hazardous_substance_test\\\"\"]');SET FOREIGN_KEY_CHECKS = 1;

代码:

实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.Data;/*** @author zhangkx1.ziroom.com* @create 2022/3/4 11:21*/
@ApiModel(value = "qms_rule")
@Data
@TableName(value = "qms_rule")
public class QmsRule implements Serializable {/*** id*/@TableId(value = "id", type = IdType.INPUT)@ApiModelProperty(value = "id")private Integer id;/*** 规则标识*/@TableField(value = "rule_code")@ApiModelProperty(value = "规则标识")private String ruleCode;/*** 规则数据*/@TableField(value = "rule_condition")@ApiModelProperty(value = "规则数据")private String ruleCondition;private static final long serialVersionUID = 1L;
}

实体类

import lombok.Data;/*** @author zhangkx1.ziroom.com* @create 2022/3/3 18:40*/
@Data
public class RoleDict {private Integer scheduling_cycle;private Integer report_term_of_validity;private Integer early_warning_period;private String code;
}

单元测试

import com.alibaba.fastjson.JSONObject;
import com.ziroom.qms.report.model.po.QmsRule;
import com.ziroom.qms.report.model.po.RoleDict;
import com.ziroom.qms.report.service.QmsRuleService;
import com.ziroom.qms.web.WebApplication;
import org.apache.commons.lang3.StringUtils;
import org.drools.compiler.lang.DrlDumper;
import org.drools.compiler.lang.api.*;
import org.drools.compiler.lang.descr.AndDescr;
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.core.impl.InternalKnowledgeBase;
import org.junit.jupiter.api.Test;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderError;
import org.kie.internal.builder.KnowledgeBuilderErrors;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Profile;import javax.smartcardio.Card;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;@SpringBootTest(classes = WebApplication.class)
class WebApplicationTests {String param = "param";String drools = "drools";@Autowiredprivate QmsRuleService qmsRuleService;@Test@Profile("dev")void contextLoads() throws UnsupportedEncodingException {int int1 = 1;int int2 = 1;int int3 = 5;String drlString = getDrlRules();KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();kb.add(ResourceFactory.newByteArrayResource(drlString.getBytes(StandardCharsets.UTF_8)), ResourceType.DRL);KnowledgeBuilderErrors errors = kb.getErrors();for (KnowledgeBuilderError error : errors) {System.out.println("规则文件正确性有误:" + error);}InternalKnowledgeBase kBase = (InternalKnowledgeBase) KnowledgeBaseFactory.newKnowledgeBase();kBase.addKnowledgePackages(kb.getKnowledgePackages());KieSession kieSession1 = kBase.newKieSession();RoleDict roleDict = new RoleDict();roleDict.setScheduling_cycle(int1);roleDict.setReport_term_of_validity(int2);roleDict.setEarly_warning_period(int3);roleDict.setCode("report_type_test");HashMap<String, Boolean> paramValue = new HashMap<>();paramValue.put("result", false);kieSession1.setGlobal(param, paramValue);kieSession1.insert(roleDict);kieSession1.fireAllRules();kieSession1.dispose();System.out.println(paramValue.get("result"));}String getDrlRules() {PackageDescrBuilder pkgDescBuilder = DescrFactory.newPackage().name(drools).newImport().target(RoleDict.class.getName()).end().name(drools).newGlobal().identifier(param).type(HashMap.class.getName()).end();List<QmsRule> rules = qmsRuleService.list();for (QmsRule rule : rules) {RuleDescrBuilder ruleDescrBuilder = pkgDescBuilder.newRule().name(rule.getRuleCode());//attributeruleDescrBuilder.attribute("salience", "0");//lhsPatternDescrBuilder<CEDescrBuilder<RuleDescrBuilder, AndDescr>> pattern = ruleDescrBuilder.lhs().pattern(Card.class.getSimpleName());List<String> ruleCondition = JSONObject.parseArray(rule.getRuleCondition()).toJavaList(String.class);for (String constraint : ruleCondition) {if (!StringUtils.isEmpty(constraint)) {pattern.constraint(constraint);}}pattern.type(RoleDict.class.getName());pattern.end();//rhsruleDescrBuilder.rhs(param + ".put(\"result\",true);");ruleDescrBuilder.end();}pkgDescBuilder.end();//dump to String;PackageDescr packageDescr = pkgDescBuilder.getDescr();DrlDumper dumper = new DrlDumper();String drl = dumper.dump(packageDescr);System.out.println(drl);return drl;}}

drools规则引擎通过数据库存储规则相关推荐

  1. SpringBoot整合Drools规则引擎动态生成业务规则

    最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...

  2. 【规则引擎】一、规则引擎简介

    (第一章规则引擎学习入门之规则引擎简介)# 系列文章目录 规则引擎简介 前言 一.为什么要使用规则引擎? 1.不使用规则引擎的规则执行现状 2. 规则引擎优点 二.规则引擎的功能 三.规则引擎的分类实 ...

  3. java开源的规则引擎_Java常用的规则引擎

    概述 在本文中,我们将介绍Java中一些最受欢迎的规则引擎. 规则引擎简介 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编 ...

  4. mysql 规则引擎_为什么使用规则引擎?

    一天,朱斯参加了一场code Review研讨会.会上的一群人正在讨论着如何对祖传代码进行变更,大家你一言,我一语,场面十分热闹! 突然,只见人群中的一个人满面愁容,说道:"昨天在项目中看到 ...

  5. 规则引擎 java 设计_规则引擎设计

    最近用到了规则引擎 ,简单做一个总结. 规则,说白了,就是,现状(fact)怎么样,如果(condition)怎么样,那么(action)怎么样. 规则引擎使用了rete算法,我这边使用的是drool ...

  6. mysql数据库修改列排序规则_更改数据库排序规则

    在SQLServer2008R2版本及以上,我们选择的都是默认安装,所以在创建数据库的时候,服务器默认选择的排序规则是一个SQL_Latin1_General_CP1_CI_AS排序规则,这样在向数据 ...

  7. 规则引擎一:IBM规则引擎 ODM入门

    转自http://www.cnblogs.com/soul-tap/p/4956052.html IBM规则引擎(ODM)入门系列一(1):如何编写规则项目 最近,因项目需要,研究使用IBM的规则引擎 ...

  8. mysql查询数据库存储引擎_MySQL数据库存储引擎

    存储引擎就是指表类型,数据库存储引擎决定了表在计算机中的存储方式. 1,查询mysql数据库支持的存储引擎类型:SHOW ENGINES \G("\G"的作用是让结构显示的更加美观 ...

  9. java 规则引擎_【java规则引擎】java规则引擎搭建开发环境(示例代码)

    Drools and jBPM consist out of several projects:(Drools软件包提供的几个部分的功能) ------------------------------ ...

  10. emq数据储存到mysql_EMQ X 规则引擎系列(三)存储消息到 InfluxDB 时序数据库

    前言 InfluxDB 是一个用于存储和分析时间序列数据的开源数据库,内置 HTTP API,类 SQL 语句的支持和无结构的特性对使用者而言都非常友好.它强大的数据吞吐能力以及稳定的性能表现使其非常 ...

最新文章

  1. Binary XML file line #39: 最多只支持3个子View,Most only support three sub vi
  2. 成本预算的四个步骤_干货!如何做好年度培训计划中的预算工作
  3. iOS 线程之GCD的高级使用方法
  4. 用边缘计算为智能制造提速,行业的破局者是他们
  5. pandas 指定某一列的数据类型
  6. 复习笔记(四)——C++继承
  7. HDU 5741 Helter Skelter(构造法)
  8. 震惊,用了这么多年的 CPU 利用率,其实是错的
  9. 统计学习方法笔记(李航)———第六章(逻辑斯谛回归)
  10. Linux 命令(22)—— touch 命令
  11. 计算机日常英语,计算机英语的常用句子
  12. 【综合篇】Web前端性能优化原理问题
  13. DH参数(Denavit-Hartenberg parameters)
  14. 怎样用捷速PDF编辑器修改PDF文档
  15. java8分组lambda_Java 8,Lambda:在分组列表中排序并将所有组合并到列表中
  16. 160亿数据点图表控件LightningChart振动分析可以检测什么?
  17. 用c语言switch写运费的,超级新手,用switch写了个计算器程序,求指导
  18. unity学习日志 第一天
  19. bigDecimal学习笔记_隋小白
  20. vue实现一个类似浏览器搜索功能(ctrl + f)

热门文章

  1. 《数字图像处理 第三版》(冈萨雷斯)——第四章 频率域处理
  2. vlfeat各种版本下载链接:
  3. stc15f2k60f2单片机定时器_STC15F2K60S2系列
  4. 图解TCPIP(第5版)
  5. 微信小程序安卓和ios时间格式问题
  6. 解决GLIDE4.0和圆角裁剪CENTERCROP冲突
  7. 保姆级的Arduino循迹小车研发日志及一些坑(其中包含L298N、Arduino、TCRT5000以及1:48的TT电机的使用)
  8. csdn账号不能合并
  9. MATLAB自带的遗传算法工具箱(GADS)
  10. multisim中pwl_Multisim 14电路设计与仿真