001package top.cenze.rulepolicy.frame.config;
002
003import org.kie.api.KieBase;
004import org.kie.api.builder.KieBuilder;
005import org.kie.api.builder.KieFileSystem;
006import org.kie.api.builder.KieRepository;
007import org.kie.api.runtime.KieContainer;
008import org.kie.api.runtime.KieSession;
009import org.kie.internal.io.ResourceFactory;
010import org.kie.spring.KModuleBeanFactoryPostProcessor;
011import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
012import org.springframework.context.annotation.Bean;
013import org.springframework.context.annotation.Configuration;
014import org.springframework.core.io.Resource;
015import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
016import org.springframework.core.io.support.ResourcePatternResolver;
017import top.cenze.rulepolicy.frame.utils.KieUtil;
018
019import java.io.IOException;
020
021/**
022 * @desc: 规则配置
023 * @author: chengze
024 * @createByDate: 2023/8/3 13:37
025 */
026@Configuration
027public class DroolsConfig {
028
029    //指定规则文件存放的目录
030    public static final String RULES_PATH = "rules/";
031
032    /**
033     * 内存文件系统
034     * @return
035     * @throws IOException
036     */
037    @Bean
038    @ConditionalOnMissingBean
039    public KieFileSystem kieFileSystem() throws IOException {
040        // 创建文件系统
041        KieFileSystem kieFileSystem = KieUtil.getKieServices().newKieFileSystem();
042
043        // 创建资源解释器
044        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
045
046        // 获取resource下RULES_PATH下所有资源文件
047        Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");
048
049        String path = null;
050        for (Resource file : files) {
051            path = RULES_PATH + file.getFilename();
052
053            // 将资源文件载入至内存文件系统中
054            kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
055        }
056
057        return kieFileSystem;
058    }
059
060    /**
061     * 内存容器
062     * @return
063     * @throws IOException
064     */
065    @Bean
066    @ConditionalOnMissingBean
067    public KieContainer kieContainer() throws IOException {
068        KieRepository kieRepository = KieUtil.getKieServices().getRepository();
069        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
070        KieBuilder kieBuilder = KieUtil.getKieServices().newKieBuilder(kieFileSystem());
071        kieBuilder.buildAll();
072        KieContainer kieContainer = KieUtil.getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
073
074        KieUtil.setKieContainer(kieContainer);
075        return kieContainer;
076    }
077
078    /**
079     * 内存仓库
080     * @return
081     * @throws IOException
082     */
083    @Bean
084    @ConditionalOnMissingBean
085    public KieBase kieBase() throws IOException {
086        KieBase kieBase = kieContainer().getKieBase();
087
088        KieUtil.setKieBase(kieBase);
089        return kieBase;
090    }
091
092    @Bean
093    @ConditionalOnMissingBean
094    public KieSession kieSession() throws IOException {
095        KieSession kieSession = kieBase().newKieSession();
096
097        return kieSession;
098    }
099
100    @Bean
101    @ConditionalOnMissingBean
102    public KModuleBeanFactoryPostProcessor kiePostProcessor() {
103        return new KModuleBeanFactoryPostProcessor();
104    }
105}