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}