规则引擎--Drools整合SpringBoot

本文档基于Drools 7.69.0.Final 版本整合

官方文档地址:www.drools.org

基于maven构建项目:

pom.xml中引入相关依赖,同时排除相关spring的依赖



    4.0.0
    com.songzerong
    drools
    0.0.1-SNAPSHOT
    drools
    Drools与SpringBoot整合并使用
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.0
         
    
    
        7.69.0.Final
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
            org.kie
            kie-spring
        

    
    
        
            
            
                org.drools
                drools-bom
                pom
                ${drools.version}
                import
            
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.1
                
                    1.8
                    1.8
                    UTF-8
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                2.3.7.RELEASE
                
                    com.songzerong.drools.DroolsApplication
                
                
                    
                        repackage
                        
                            repackage
                        
                    
                
            
        
    


本文档将从以下两种方式讲述drools的使用

  • 方式一:基于java实现规则引擎的使用;

  • 方式二:与SpringBoot整合,通过注解方式实现。

方式一:

        // 获取单例的kieservice
        KieServices kieServices = KieServices.Factory.get();
        // 指定规则文件
        KieFileSystem kfs = kieServices.newKieFileSystem();
        kfs.write(ResourceFactory.newClassPathResource("rules/user.drl", "UTF-8"));
        // 构造规则文件到kieservice
        kieServices.newKieBuilder(kfs).buildAll();
        // 拿到kecontainer 通过kieservice 以及默认的版本号
        KieContainer kieContainer = 
        kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
        // 通过kiecontainer 拿到 kiebase
        KieBase kieBase = kieContainer.getKieBase();
        // 拿到kiesession
        KieSession kieSession = kieBase.newKieSession();
        // 准备要验证的数据
        User user = new User(1L, "szr", "111111", 23);
        // 将准备好的数据写入kiesession
        kieSession.insert(user);
        // 验证所有的规则是否满足 或指定某一个规则
        kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule_notContains"));
        // 清除kiesession
        kieSession.dispose();

方式二:

drools配置类:


/**
 * 规则引擎配置类
 * @author songzerong
 */
@Configuration
public class DroolsAutoConfiguration {

    private static final String RULES_PATH = "rules/";

    @Bean
    @ConditionalOnMissingBean(KieServices.class)
    public KieServices getKieServices() {
        return KieServices.Factory.get();
    }

    @Bean
    @ConditionalOnMissingBean(KieFileSystem.class)
    public KieFileSystem kieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
        for (Resource file : getRuleFiles()) {
            kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
        }
        return kieFileSystem;
    }

    private Resource[] getRuleFiles() throws IOException {
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
    }

    @Bean
    @ConditionalOnMissingBean(KieContainer.class)
    public KieContainer kieContainer() throws IOException {
        final KieRepository kieRepository = getKieServices().getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
        kieBuilder.buildAll();
        return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
    }

    @Bean
    @ConditionalOnMissingBean(KieBase.class)
    public KieBase kieBase() throws IOException {
        return kieContainer().getKieBase();
    }

}

单元测试:

    @Resource
    private KieBase kieBase;

    @Test
    public void test(){
        // 拿到kiesession
        KieSession kieSession = kieBase.newKieSession();
        // 准备要验证的数据
        User user = new User(1L, "szr", "111111", 23);
        // 将准备好的数据写入kiesession
        kieSession.insert(user);
        // 验证所有的规则是否满足 或指定某一个规则
        kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule_contains"));
        // 清除kiesession
        kieSession.dispose();
    }

至此,drools与springboot的整合完成。

你可能感兴趣的:(规则引擎,其他)