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}