drools规则引擎通过数据库存储规则
生活随笔
收集整理的這篇文章主要介紹了
drools规则引擎通过数据库存储规则
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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规则引擎通过数据库存储规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帕斯卡命名法 pascal命名法
- 下一篇: JSP2.0中Simple Tag介绍