001package top.cenze.rulepolicy.frame.utils; 002 003import cn.hutool.core.collection.CollectionUtil; 004import com.alibaba.fastjson.JSON; 005import org.kie.api.KieBase; 006import org.kie.api.KieServices; 007import org.kie.api.builder.Message; 008import org.kie.api.builder.Results; 009import org.kie.api.io.ResourceType; 010import org.kie.api.runtime.KieContainer; 011import org.kie.internal.utils.KieHelper; 012import top.cenze.rulepolicy.frame.entity.dto.RuleDTO; 013 014import java.util.List; 015 016/** 017 * @desc: 规则管理工具 018 * @author: chengze 019 * @createByDate: 2023/8/8 17:30 020 */ 021public class KieUtil { 022 023 private static KieServices kieServices = KieServices.Factory.get(); 024 private static KieContainer kieContainer; 025 private static KieBase kieBase; 026 027 public static KieContainer getKieContainer() { 028 return kieContainer; 029 } 030 031 public static void setKieContainer(KieContainer kieContainer) { 032 KieUtil.kieContainer = kieContainer; 033 } 034 035 public static KieServices getKieServices() { 036 return kieServices; 037 } 038 039 public static KieBase getKieBase() { 040 return kieBase; 041 } 042 043 public static void setKieBase(KieBase kieBase) { 044 KieUtil.kieBase = kieBase; 045 } 046 047 /** 048 * 重载规则 049 * @param lstRule 050 */ 051 public static void reloadRule(List<RuleDTO> lstRule) { 052 // 借助 kieHelper 添加规则 053 KieHelper kieHelper = new KieHelper(); 054 // 从数据库中获取所有的规则 055 if (CollectionUtil.isNotEmpty(lstRule)) { 056 // 循环加载所有的规则 057 for (RuleDTO rule : lstRule) { 058 String content = rule.getRuleContent(); 059 kieHelper.addContent(content, ResourceType.DRL); 060 } 061 } 062 // 校验规则是否异常 063 Results results = kieHelper.verify(); 064 System.out.println("results: " + JSON.toJSONString(results)); 065 if (results.hasMessages(Message.Level.ERROR)) { 066 System.out.println(results.getMessages()); 067 throw new IllegalStateException("### errors ###"); 068 } 069 // 重置容器 070 KieContainer kieContainer = kieHelper.getKieContainer(); 071 KieUtil.setKieContainer(kieContainer); 072 073 // 重置规则库 074 KieBase kieBase = kieContainer.getKieBase(); 075 KieUtil.setKieBase(kieBase); 076 } 077}